2013-12-15 24 views
1

我有以下ResourceDictonary定義ResourceDictionary中只有一次

<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> 

,你可以看到這些資源是靜態的,我想從我的其他類和庫訪問它們 所以我所做的是在我的應用程序。 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; 

回答

2

通過名字來訪問一個資源字典,讓您的DatabaseViewModel是有點問題的,因爲它不會從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; 
1

我不知道,如果你可以從MergedDictionaries集合按名稱獲取ResourceDictionary中。然而,它看起來好像你只想訪問它以獲取其中的特定資源(是有道理的)。

在這種情況下,您可能要考慮使用FrameworkElement.TryFindResource

這應該搜索邏輯樹並最終​​到達您的App.xaml級別。爲了清楚起見,你應該能夠通過

FrameworkElement fe = new FrameworkElement(); 
var myResource = fe.TryFindResource("DatabaseViewModel");