2011-01-31 58 views
4

我有一個WPF UserControls庫和一個在庫中共享的ResourceDictionary。在UserControl中引用父項的ResourceDictionary

該庫中的所有用戶控件只出現在單個「外殼」父控件中,這實際上只是一個較小控件集合的容器。我能夠從我的殼控制訪問的ResourceDictionary如預期,當我添加以下XAML

<Control.Resources> 
    <ResourceDictionary Source="MyResources.xaml" /> 
</Control.Resources> 

但是我不能從坐的「外殼」控件中的子控件訪問ResourceDictionary中。

我的印象是,WPF應該在本地檢查資源,然後向上遍歷,直到找到合適的資源?

相反,我得到

Cannot find resource named '{BoolInverterConverter}'. 
Resource names are case sensitive. Error at  
    object 'System.Windows.Data.Binding' in markup file... 

很顯然,我可以(我)在我的子控件引用ResourceDictionary中;但是現在每個控件都需要引用這本詞典,我相信這不是必需的。

任何想法,我做的事情是奇怪的還是我對行爲的期望不正確?

回答

4

發生了什麼描述here,雖然文檔有點不透明。如果在未指定密鑰的情況下將ResourceDictionary添加到元素的Resources屬性中,WPF預計您將合併到資源字典中,並且它會使用字典的MergedDictionaries屬性中的字典內容填充字典。它忽略了ResourceDictionary沒有密鑰的實際內容。

所以你想做的事是這樣的:

<Control.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="MyResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Control.Resources> 

編輯:

工作的示例:

MainWindow.xaml:

<Window x:Class="MergedDictionariesDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MergedDictionariesDemo="clr-namespace:MergedDictionariesDemo" Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Dictionary1.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <MergedDictionariesDemo:UserControl1 /> 
    </Grid> 
</Window> 

Dictionary1.xaml :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <SolidColorBrush x:Key="UCBrush" 
        Color="Bisque" /> 
</ResourceDictionary> 

UserControl1.xaml:

<UserControl x:Class="MergedDictionariesDemo.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Border Margin="10" BorderBrush="Navy" BorderThickness="1" CornerRadius="10"> 
     <TextBlock Margin="10" 
        Background="{DynamicResource UCBrush}"> 
      The background of this is set by the resource UCBrush. 
     </TextBlock> 

    </Border> 
</UserControl> 
+0

謝謝您的回答;不幸的是,這給出了與我原來的XAML相同的「無法找到資源...」的結果。我正在嘗試使用Keys,但沒有找到任何成功。文檔鏈接的哪一部分描述了發生了什麼 - 我閱讀了它,並且與ResourceDictionaries相關,但是我沒有看到任何特定的資源是否可用於控制層次結構中。 – 2011-01-31 22:30:29

相關問題