在资源字典中使用BasedOn设置Elements.Resource样式

时间:2010-12-13 16:18:09

标签: wpf datatemplate styles

我有一个资源字典,用于为我的应用程序定义外观(样式)。

我刚创建了另一个资源字典,其中包含我在几个不同屏幕上使用的DataTemplates(甚至在同一屏幕中多次),以显示我的业务对象。

我想更改DataTemplates中的一些默认样式,以便控件更合适;但是我希望控件继承与屏幕其余部分相同的样式。所以,我自然希望将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>

现在,我有另一个包含我在窗口中使用的DataTemplates的资源字典。它被称为“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,但这也失败了。 我不知道怎么解决这个问题。

任何建议都将不胜感激!

谢谢,

-Frinny

2 个答案:

答案 0 :(得分:1)

我在使用扩展按钮样式时遇到了同样的问题。

ResourceKey=就是为我解决的问题。

这有效:

<Style x:Name="ButtonVisibility" 
       TargetType="{x:Type Button}" 
       BasedOn="{StaticResource ResourceKey={x:Type Button}}">

答案 1 :(得分:0)

您对类型的基础方式是正确的。这在理论上是有效的,只要在运行时,您基于它的样式就会正确地合并到树中。确保正确合并了“myStyles.xaml”。您可以通过删除您尝试修改的样式来检查这一点,并确保它在“myStyles.xaml”中的样式中正确显示。

如果不是有很多地方你可能会出错,但尝试合并你正在处理的文件中的样式总是有帮助的,然后在树上查看它丢失的位置。

此实用程序将帮助您查看运行时树中的内容。

http://blois.us/Snoop/