Установка стиля Elements.Resource с помощью BasedOn в словаре ресурсов - PullRequest
1 голос
/ 13 декабря 2010

У меня есть словарь ресурсов, который я использую для определения внешнего вида (стиля) для моего приложения.

Я только что создал другой словарь ресурсов, который содержит шаблоны данных, которые я использую в нескольких различныхэкраны (и даже несколько раз на одном и том же экране) для отображения моих бизнес-объектов.

Я хотел бы изменить некоторые стили по умолчанию в моих шаблонах данных, чтобы элементы управления лучше подходили;однако я хотел бы, чтобы элементы управления наследовали тот же стиль, что и остальная часть экрана.Поэтому, естественно, я хочу использовать свойство BasedOn для этой задачи.

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как установить свойство BasedOn в значение.

Например,в словаре ресурсов, который содержит мои стили (называемые «myStyle.xaml»), у меня есть:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="#F5F5F5" />
        <Setter Property="FontSize" Value="12"></Setter>
        <Setter Property="Width" Value="120"></Setter>
        <Setter Property="FontFamily" Value="Arial"></Setter>
  </Style>
  <Style TargetType="{x:Type TextBox}">
        <Setter Property="FontSize" Value="12"></Setter>
        <Setter Property="Width" Value="120"></Setter>
        <Setter Property="Height" Value="25"></Setter>
        <Setter Property="Background" Value="Black"></Setter>
  </Style>
  <!-- .... and so on .... -->
</ResourceDictionary>

Я использую этот ресурс в следующем окне:

<Window x:Class="SiteSetupWindow4"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
        Title="A Screen">

    <Window.Resources>
        <ResourceDictionary x:Key="defaultStyleX">
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary x:Name="DefaultStyles" Source="Resources/myStyle.xaml" />
                <ResourceDictionary  x:Name="Templates" Source="Resources/myTemplates.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Window.Resources>

Теперь яесть другой словарь ресурсов, который содержит шаблоны данных, которые я использую в моем окне.Это называется "myTemplates".Стиль применяется к DataTemplate, как и ожидалось;однако я хотел бы перезаписать некоторые аспекты стиля в DataTemplate (например, ширину).

Это то, что я устал, однако я не могу заставить свойство BasedOn работать ...

(myTemplate.xaml)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

   <DataTemplate x:Key="PanelInfo">
            <StackPanel>
                <StackPanel.Resources>
                    <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
                        <Setter Property="Width" Value="120" />
                    </Style>
                    <Style TargetType="Label">
                        <Setter Property="Width" Value="180" />
                    </Style>
                    <Style TargetType="ComboBox">
                        <Setter Property="Width" Value="120" />
                    </Style>
                <StackPanel.Resources>
                <StackPanel Orientation="Horizontal">
                    <Label Content="Type:"></Label>
                    <ComboBox>
                        <ComboBoxItem Content="{Binding Path=Type}" IsSelected="True"></ComboBoxItem>
                    </ComboBox>
                    <!--...and so on -->
                </StackPanel>
            </StackPanel>
</ResourceDictionary>

Это не удается .... Я также пытался использовать DynamicResource, но это также не удается.Я не уверен, как обойти это.

Любой совет будет принята с благодарностью!

Спасибо,

-Фринни

Ответы [ 2 ]

1 голос
/ 09 августа 2013

У меня возникла та же проблема с расширенным стилем кнопок.

ResourceKey= - это то, что решило ее для меня.

Это сработало:

<Style x:Name="ButtonVisibility" 
       TargetType="{x:Type Button}" 
       BasedOn="{StaticResource ResourceKey={x:Type Button}}">
0 голосов
/ 13 декабря 2010

То, как вы используете BasedOn для типа, является правильным.Это будет работать теоретически до тех пор, пока во время выполнения стиль, на котором вы его основываете, будет правильно объединен с деревом.Убедитесь, что файл myStyles.xaml включен правильно.Вы можете проверить это, удалив свой стиль, который вы пытались изменить, и убедитесь, что он правильно отображается в вашем стиле в «myStyles.xaml».

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

Эта утилита поможет вам увидеть, что происходит в дереве во время выполнения..

http://blois.us/Snoop/

...