내 앱이 startupuri를 설정하지 않으면 app.xaml 파일이 구문 분석되지 않습니까?
문제
배경 : MVVM을 사용하여 WPF 앱을 만들고 DI 컨테이너를 사용하여 ViewModels를 만들었습니다.
내 app.xaml은 다음과 같습니다.
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
mainwindow.xaml은 다음과 같습니다.
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
이제 이것은 모두 잘 작동하지만 StartupUri
내가 원하지 않는 XAML로 하드 코딩됩니다.
내가 찾은 여러 블로그 포스트와 기사의 지침에 따라 StartupUri
, 그리고 만들려고 노력했습니다 MainWindow
훅킹으로 OnStartup
app.xaml.cs에서 다음과 같습니다.
protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}
문제는이 예외를 제외하고는 앱이 창을 보여 주려고 할 때 충돌한다는 것입니다.
'{servicelocator}'라는 자원을 찾을 수 없습니다. 리소스 이름은 사례에 민감합니다. 마크 업 파일 'wpfapp; component/mainwindow.xaml'라인 8 위치 45에서 오브젝트 'system.windows.data.binding'에서 오류.
내가 알 수있는 한, <Application.Resources>
섹션은 단순히 XAML 파일에서 읽지 않습니다. OnStartup에 코드를 넣을 수 있도록 프로그램적으로 자원을 추가 할 수 있습니다.
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
그러나 그것은 추악한 해킹이며, 나중에 app.xaml 파일에 다른 것을 넣고 싶다면 :-(
다른 이벤트를 연결해야합니까? 이것에 대한 방법이 있습니까?
해결책
Onstartup을 재정의하는 대신 대신 이벤트를 사용해보십시오.
<Application x:Class="My.App"
xmlns="..."
Startup="Application_Startup"
ShutdownMode="OnExplicitShutdown">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
뒤에 코드 :
public partial class App : Application
{
public App()
{ }
private void Application_Startup(object sender, StartupEventArgs e)
{
// TODO: Parse commandline arguments and other startup work
new MainWindow().Show();
}
}
다른 팁
가장 간단한 해결 방법은 a의 정의입니다 X : 이름:
<Application x:Name="App" ...
<Application.Resources>
...
</Application.Resources>
</Application>
나는 비슷한/이 같은 문제를 겪습니다. 연결하는 데 필요한 코드 생성 버그가 있습니다. <Application.Resources>
프로그램의 나머지 부분에 때때로 <Application.Resources>
하나의 항목 만 포함되어 있으며 a는 없습니다 StartupUri
기인하다.
세부:http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-intry-intry-intry- (면책 조항-링크가 내 블로그를 가리 킵니다)
이 지식 버그를 둘러 보려면 프로그래밍 방식으로 리소스를 추가 할 수도 있습니다.
var rd = new ResourceDictionary()
rd.Source = new Uri("pack://application:,,,/Resources;component/Colors.xaml");
Resources.MergedDictionaries.Add(rd);
이 코드는 App
수업.