Как получить ресурс из объединенного ResourceDictionary в файле с выделенным кодом? - PullRequest
3 голосов
/ 24 сентября 2010

У меня есть пользовательский элемент управления, не зависящий от вида, полученный из класса Control.Его шаблон определен в файле Generic.xaml.Теперь я хочу добавить к нему некоторые элементы пользовательского интерфейса (в основном, кисти) и сделать это в отдельном словаре ресурсов, а затем получить доступ к ним из feil-кода (* .xaml.cs).См. Ниже: Generic.xaml (фрагмент):

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:PTE.Controls" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="PTE.Controls;component/Resources/CategoriesColors.xaml"/>
</ResourceDictionary.MergedDictionaries>
<CornerRadius x:Key="elementCornerBorder" BottomLeft="2" BottomRight="2" TopLeft="2" TopRight="2"/> 
<Style TargetType="{x:Type local:Element}">
    <Setter Property="Canvas.ZIndex" Value="50"/>
    <Setter Property="MinWidth" Value="60"/>
    <Setter Property="Template">...

CategoriesColors.xaml (фрагмент):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<LinearGradientBrush StartPoint="0,1" EndPoint="1,0" x:Key="categoryNobleGas">
    <GradientStop Color="White" Offset="0"/>
    <GradientStop Color="RoyalBlue" Offset="0.5"/>
    <GradientStop Color="SteelBlue" Offset="1"/>
</LinearGradientBrush>...

Серверная часть (фрагмент):

        private static void OnCategoryNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var categoryName = (CategoryName)e.NewValue;
        var element = (Element) d;
        switch (categoryName)
        {
            case CategoryName.NobleGas:
                element.Background = (Brush)element.TryFindResource("categoryNobleGas");
                break;
            case CategoryName.Halogen:
                element.Background = (Brush)element.TryFindResource("categoryHalogen");
                break;
            case CategoryName.OtherNonmetal:
                element.Background = (Brush)element.TryFindResource("categoryOtherNonmetal");
                break;
            case CategoryName.Metalloid:

Это не работаетВ основном метод TryFindResource всегда возвращает ноль.Есть идеи, как заставить эти вещи работать вместе?Спасибо!

UPD: Если я добавлю следующую строку в конструктор элемента управления, он будет работать:

this.Resources = Application.LoadComponent(new Uri("PTE.Controls;Component/Resources/CategoriesColors.xaml", UriKind.Relative)) as ResourceDictionary;

Но сначала он будет дублировать словарь (загрузить новыйодин раз) и потреблять значительно больше памяти.Во-вторых, я действительно хочу сделать это в XAML.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Вы когда-нибудь нашли ответ?Возможно, вам удастся решить проблему, загрузив ресурсный словарь в объединенный словарь вашего app.xaml и получите к нему доступ через Application.Current.TryFindResource (...)

0 голосов
/ 24 сентября 2010

Попробуйте добавить / в ResourceDictionary внутри MergedDictionaries, как показано ниже.Инфронт PTE

<ResourceDictionary Source="/PTE.Controls;component/Resources/CategoriesColors.xaml"/>

HTH

...