Не удается найти именованный стиль в Generic.xaml

У меня есть следующий настраиваемый элемент управления

public class MagicButton : Control
{
    static MagicButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MagicButton), 
            new FrameworkPropertyMetadata(typeof(MagicButton)));
    }
}

со следующими темами / Generic.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication4">

<Style TargetType="{x:Type l:MagicButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type l:MagicButton}">
                <Border />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type l:MagicButton}"
       x:Key="OtherStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type l:MagicButton}">
                <Border />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

When I use the MagicButton control using the default style, everything works, but when I try to use "OtherStyle"

<l:MagicButton Style="{StaticResource OtherStyle}"/>

не удается найти стиль за исключением "{" Не удается найти ресурс с именем 'OtherStyle'. Имена ресурсов чувствительны к регистру. "}"

Но если я перенесу OtherStyle в App.xaml, он заработает.

Я не хочу помещать его в App.xaml, но я хочу, чтобы мой файл Themes / Generic.xaml содержал стили по умолчанию, а также стили с ключевыми именами, которые люди могут явно использовать.


person wforl    schedule 22.06.2014    source источник
comment
проверьте свой код, у меня есть тест, и все в порядке. <Window.Resources> <ResourceDictionary Source="Themes/Generic.xaml" /> </Window.Resources> <Grid> <local:CustomControl1 Width="100" Height="40" Style="{StaticResource OtherStyle}" Margin="199.5,54.5,217.5,224.5"/> </Grid>   -  person Rang    schedule 23.06.2014
comment
Themes / Generic.xaml находится в том же проекте, что и код, пытающийся использовать OtherStyle. Почему мне нужно явно добавить ResourceDictionary? Похоже, что стиль по умолчанию работает без этого.   -  person wforl    schedule 27.06.2014


Ответы (1)


Поскольку для файла generic.xaml нет кода, мы не можем создать его экземпляр для чтения из него Style. CustomControls получают доступ к Styles из него, используя DefaultStyleKey, как вы показали в своем примере. Следовательно, вы не можете получить к нему доступ другими способами.

Однако Application.Resources - правильное место для определения ваших пользовательских Style для этого элемента управления, как и для всех других элементов управления. Вы были бы счастливы определить Styles для Button или любого другого элемента управления .NET, так почему бы и не для ваших собственных элементов управления?


ОБНОВЛЕНИЕ >>>

Это не стиль, специфичный для приложения, это альтернативный стиль для элемента управления, который я хотел сохранить в теме / Generic.xml, чтобы любой проект, ссылающийся на тему, также мог его использовать.

Да, но вы пытаетесь сослаться на него вне generic.xaml и не можете ... это не похоже на Application.Resources. Что вы можете сделать, так это добавить DependencyProperty в свой элемент управления, который устанавливает различные Style внутри.

person Sheridan    schedule 23.06.2014
comment
Это не стиль, специфичный для приложения, это альтернативный стиль для элемента управления, который я хотел сохранить в теме / Generic.xml, чтобы любой проект, ссылающийся на тему, также мог его использовать. - person wforl; 27.06.2014