如何从CustomControl.cs C#文件访问XAML资源?

时间:2010-11-06 12:10:45

标签: wpf resources controls

我有一个XXXCustomControl.cs类,在c#类里面我想通过

访问
groupStyle.ContainerStyle = this.FindResource("GroupHeaderStyle") as Style;

GroupHeaderStyle,但此样式在其他地方定义(无论在哪里......)

现在我的问题:放置我的GroupHeaderStyle以及如何通过

获取它的最佳位置是什么?

来自c#代码的FindResource?

2 个答案:

答案 0 :(得分:5)

如果您的Style在ResourceDictionary中定义,您始终可以使用

在代码后面访问它
Uri resourceLocater = new Uri("/AssemblyName;component/DictionaryName.xaml", System.UriKind.Relative);
ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater);
groupStyle.ContainerStyle = resourceDictionary["GroupHeaderStyle"] as Style; 

答案 1 :(得分:2)

您应该将包含该样式的XAML文件包含在App的资源字典中作为MergedDictionary:

<Application.Resources>
    <ResourceDictionary>
        <!--  here you can add some more resources -->
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="mystyles.xaml"/>
            <!--  here you can add some dictionaries -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

请参阅此处的示例:http://www.wpftutorial.net/MergedDictionaryPerformance.html

或者实际上您可以将样式定义直接放入App的资源中,而无需合并资源字典。但是这样App的资源通常会很快膨胀。

编辑:
对于库的情况,您没有可用的App.xaml。所以你需要基本上做以下几点:

  1. 将资源字典添加到项目中,并在那里定义所需的样式。
  2. 在控件的资源中,将您的字典称为合并字典。
  3. 请注意,您需要为字典指定完整路径(“pack URI”):

    <Control.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Control.Resources>