如果只有一个,则无法检索WPF应用程序资源

Jim*_*m C 4 wpf

这是我的代码或WFP中的错误吗?使用VisualStudio 2013,以.NET 4.5.1为目标.

<Application x:Class="WPFDemo.MyApp"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:WPFDemo.ViewModels">

    <Application.Resources>
        <vm:TestClass x:Key="tc" />
    </Application.Resources>
</Application>

   public partial class MyApp : Application
   {  
      protected override void OnStartup(StartupEventArgs e)
      {
         base.OnStartup(e);
         var mainWindow = new MainWindow();
         mainWindow.Show();
      }
   }

   public partial class MainWindow
   {
      public MainWindow()
      {
         InitializeComponent();
         object o = Application.Current.Resources["tc"];
      }
   }
Run Code Online (Sandbox Code Playgroud)

问题:o为空.

如果我添加至少一个任何类型的其他资源:

<Application.Resources>
    <vm:TestClass x:Key="tc" />
    <vm:TestClass2 x:Key="tc2" />
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

并且不会在任何地方进行任何其他更改,o作为TestClass的实例返回.

咦?

dko*_*ozl 6

我发现Application.ResourcesStartupURI没有定义时不加载时很少引用bug

并且似乎有3个解决此问题的方法(4包括创建虚拟资源)

定义字典

<Application.Resources>  
    <ResourceDisctionary>
        <ResourceDictionary.MergedDictionaries/>
        <vm:TestClass x:Key="tc" />
    </ResourceDisctionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

但它似乎很奇怪,因为它需要空ResourceDictionary.MergedDictionaries标签

不要覆盖OnStartup方法,而是使用Startup事件

<Application ... Startup="Application_Startup">
Run Code Online (Sandbox Code Playgroud)

并在代码中

private void Application_Startup(object sender, StartupEventArgs e)
{
    var mainWindow = new MainWindow();
    mainWindow.Show();
}
Run Code Online (Sandbox Code Playgroud)

给你Application一个名字

<Application ... x:Name="myApplication">
Run Code Online (Sandbox Code Playgroud)