WPF Grid.Resources Стиль ломает ResourceDictionary Style. Как заставить их сосуществовать? - PullRequest
4 голосов
/ 05 мая 2011

В приложении WPF у меня есть ResourceDictionary с Style, определенным для TargetType MyCustomControl:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:cc="clr-namespace:MyControlLibrary;assembly=MyControlLibrary" >

  <Style TargetType="{x:Type cc:MyCustomControl}"> 
    <Setter Property="Prop1" Value="1" />
    <Setter Property="Prop2" Value="2" />
    ...

Проблема в том, что мне нужно определить контекстное меню для MyCustomControl на странице XAML, как показано ниже:

   <Grid>
     <Grid.Resources>
           <ContextMenu x:Key="MyControlContextMenu">
               <MenuItem Name="Name1" 
                         Header="Header1" 
                         Click="Cm1_Click"
                         .../>                   
                ....
            </ContextMenu>
       <Style TargetType="{x:Type ScNamespace:MyCustomControl}">
         <Setter Property="ContextMenu" Value="{StaticResource MyControlContextMenu}"/>
       </Style>
     </Grid.Resources>
   ...

В этом случае, хотя я назначаю только одно свойство в определении стиля внутри своей таблицы, значения стиля ResourceDictionary не применяются вообще. Они переопределяются стилем ресурса страницы и игнорируются.

Как решить эту проблему? Может быть, есть способ сделать ссылку на ResourceDictionary в разделе Grid.Resources для принудительного поиска стиля ResourceDictionary?

Ответы [ 3 ]

4 голосов
/ 05 мая 2011

Для вашего нового стиля используйте стиль по умолчанию:

<Style TargetType="{x:Type ScNamespace:MyCustomControl}" BasedOn="{StaticResource {x:Type ScNamespace:MyCustomControl}}">
    <Setter Property="ContextMenu" Value="{StaticResource MyControlContextMenu}"/>
</Style>
1 голос
/ 05 мая 2011

Как правило, элементы управления должны иметь свои стили по умолчанию, определенные в папке «Темы» в файле определенной темы (для получения дополнительной информации см. здесь ).

Когда приложение ищетресурс, он просматривает три уровня в следующем порядке:

1) Уровень элемента.

Система запускается с элемента, который ссылается на ресурс, а затем ищет ресурсы логического родителя ии так далее, пока не будет достигнут корневой элемент.

2) Уровень приложения.

Ресурсы, определенные объектом приложения.

3) Уровень темы.

Словари уровня темы хранятся в подпапке «Темы».Файлы в папке «Темы» соответствуют темам.Например, у вас могут быть Aero.NormalColor.xaml, Luna.NormalColor.xaml, Royale.NormalColor.xaml и так далее.Вы также можете иметь файл с именем generic.xaml.Когда система ищет ресурс на уровне тем, она сначала ищет его в файле, связанном с темой, а затем ищет его в generic.xaml.

В вашем случае у вас есть два неявныхСтили, поэтому ответы HCL и Кента должны работать.Поскольку одновременно может применяться только один неявный стиль.То же самое касается правильной настройки стиля.В этом случае неявные стили не будут применены.

Если у вас есть первая настройка стиля в качестве стиля по умолчанию на уровне темы, то он будет применяться в дополнение к вашему второму неявному стилю.Стиль (или любой явно определенный Стиль).

1 голос
/ 05 мая 2011

Не уверен, что это то, что вы ищете, но стиль может наследовать от другого.С помощью свойства BasedOn вы можете определить базовый стиль Style, чтобы новый стиль наследовал все настройки из этого стиля.

Однако я никогда не пробовал, работает ли он также, если BasedOn ссылается на тот же ключ (тип).Может быть, это работает:

<Style TargetType="{x:Type ScNamespace:MyCustomControl}" 
       BasedOn="{x:Type ScNamespace:MyCustomControl}">

Если это не работает, может быть, вы можете отделить Style, определить его глобально с помощью ключа и затем обратиться к глобально определенному стилю через BasedOn -свойство.

...