【问题标题】:Defining a ResourceDictionary only once只定义一次 ResourceDictionary
【发布时间】:2013-12-15 21:40:59
【问题描述】:

我有以下资源字典

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:SharedHelpers="clr-namespace:Shared.Helpers;assembly=Shared"
                    xmlns:SharedViewModels ="clr-namespace:Shared.ViewModels;assembly=Shared"
                    xmlns:SharedViews="clr-namespace:Shared.Views;assembly=Shared"
                    >

<DataTemplate DataType="{x:Type SharedViewModels:DatabaseViewModel}">
   <SharedViews:DatabaseView/>
</DataTemplate>

<DataTemplate DataType="{x:Type SharedViewModels:ProxyViewModel}">
  <SharedViews:ProxiesView/>
</DataTemplate>

<DataTemplate DataType="{x:Type SharedViewModels:AppUserViewModel}">
   <SharedViews:AppUserView/>
</DataTemplate>
<!--ViewModels-->
<SharedViewModels:DatabaseViewModel x:Key="DatabaseViewModel"/>
<SharedViewModels:AppUserViewModel x:Key="AppUserViewModel"/>
<SharedViewModels:ProxyViewModel x:Key="ProxyViewModel"/>
</ResourceDictionary>

您可以看到这些资源是静态的,我想从我的其他库和类中访问它们 所以我所做的是在我的 App.xaml 中我确实将字典定义如下

 <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary x:Name="dict"  Source="ResourceDict.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

从我后面的代码中我需要访问这个字典中的实例而不必重新定义它,所以我找到了

var databaseViewModelInstance = Application.Current.Resources.MergedDictionaries["dict"]["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel;

但问题是它只允许我通过索引而不是它的名称访问字典,我如何通过它的名称访问字典而不必在我想要访问它的每个类中定义一个新的资源字典实例来自?

下面的工作就好了

var databaseViewModelInstance = Application.Current.Resources.MergedDictionaries[0]["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel;

【问题讨论】:

    标签: c# .net wpf xaml resourcedictionary


    【解决方案1】:

    按名称访问资源字典有点问题,因为它不是从FrameworkElement 派生的,因此没有Name 属性。如果有,您可以执行以下操作:

    Application.Current.Resources.MergedDictionaries
                                 .First(x => x.Name == "dict")["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel;
    

    但是,您可以按来源过滤,而不是按名称过滤:

    Application.Current.Resources.MergedDictionaries
                                 .First(x => x.Source.OriginalString == "ResourceDict.xaml")["DatabaseViewModel"] as Shared.ViewModels.DatabaseViewModel;
    

    【讨论】:

      【解决方案2】:

      我不确定您是否可以按名称从 MergedDictionaries 集合中获取 ResourceDictionary。但是,您似乎只想访问它以获取其中的特定资源(有道理)。

      在这种情况下,您可能需要考虑使用FrameworkElement.TryFindResource

      这应该搜索逻辑树并最终​​到达您的 App.xaml 级别。为清楚起见,您应该能够通过

      获得您的 DatabaseViewModel
      FrameworkElement fe = new FrameworkElement();
      var myResource = fe.TryFindResource("DatabaseViewModel");
      

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 2021-10-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多