我有一个资源字典,用于为我的应用程序定义外观(样式)。
我刚创建了另一个资源字典,其中包含我在几个不同屏幕上使用的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
答案 0 :(得分:1)
我在使用扩展按钮样式时遇到了同样的问题。
ResourceKey=
就是为我解决的问题。
这有效:
<Style x:Name="ButtonVisibility"
TargetType="{x:Type Button}"
BasedOn="{StaticResource ResourceKey={x:Type Button}}">
答案 1 :(得分:0)
您对类型的基础方式是正确的。这在理论上是有效的,只要在运行时,您基于它的样式就会正确地合并到树中。确保正确合并了“myStyles.xaml”。您可以通过删除您尝试修改的样式来检查这一点,并确保它在“myStyles.xaml”中的样式中正确显示。
如果不是有很多地方你可能会出错,但尝试合并你正在处理的文件中的样式总是有帮助的,然后在树上查看它丢失的位置。
此实用程序将帮助您查看运行时树中的内容。