내 앱이 startupuri를 설정하지 않으면 app.xaml 파일이 구문 분석되지 않습니까?

StackOverflow https://stackoverflow.com/questions/543414

  •  23-08-2019
  •  | 
  •  

문제

배경 : 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>

추가 정보: http://connect.microsoft.com/visualstudio/feedback/details/472729/wpf-cannot-find-find-deource-defined-the-app-xaml-file

나는 비슷한/이 같은 문제를 겪습니다. 연결하는 데 필요한 코드 생성 버그가 있습니다. <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 수업.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top