我有一个包含几个(不同)项目的堆栈面板:
<StackPanel ...>
<TextBlock ... />
<CheckBox ... />
<CheckBox ... />
<Button ... />
</StackPanel>
我想将VerticalAlignment="Center"
应用于StackPanel 的所有子项,而无需向每个孩子添加VerticalAlignent="Center"
或Style=...
。所以,我想我想要定义一个适用于TextBlock,CheckBoxes和Button的隐式样式。
我尝试在堆栈面板的资源中添加<Style TargetType="FrameworkElement">
,但(显然)这不起作用,因为TargetType创建了一个隐含的x:Key {x:Type FrameworkElement}
,而TextBlock只自动绑定到样式为x:键为{x:Type TextBlock}
。
所以,据我所知,我唯一的选择是:(1)在堆栈面板的资源中为所有三种类型创建三种样式,(2)创建一种样式并手动将其绑定到所有子项,( 3)手动为所有孩子设置VerticalAlignment
选项。 我想要的是 :( 4)创建一个样式,自动将其绑定到堆栈面板的所有子项。那可能吗?或者是否有一些其他解决方案比(1) - (3)更少冗余?
答案 0 :(得分:3)
海因兹,
如果我正确理解您的问题,您似乎有一个StackPanel要包含一组子项。您希望这些孩子拥有样式VerticalAlignment="Center"
,但您不希望将此属性添加到每个孩子。如果是这种情况,我有一个解决方案:
但是,无法设置基础对象的属性并将它们用于继承的类中。因此,FrameworkElement
具有属性VerticalAlignment
,但您无法直接在样式中设置它并自动应用它。在我提出的解决方案中,您必须为每个对象类型创建一个样式,但您不必为每个对象类型创建不同的样式。在我的解决方案中,您可以创建一个“BaseStyle”,然后将其他每个样式基于此基础以获得所需的结果。所以你可以这样做:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="500">
<Window.Resources>
<ResourceDictionary>
<Style x:Key="BaseStyle" TargetType="{x:Type FrameworkElement}">
<Style.Setters>
<Setter Property="VerticalAlignment" Value="Center" />
</Style.Setters>
</Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseStyle}" />
<Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource BaseStyle}" />
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseStyle}" />
</ResourceDictionary>
</Window.Resources>
<Grid>
<StackPanel Orientation="Horizontal">
<TextBlock Text="testing textblock" />
<CheckBox Content="testing check1 "/>
<CheckBox Content="testing check2" />
<Button Content="testing button" />
</StackPanel>
</Grid>
</Window>
此外,您可以通过Application.xaml
在应用程序级别设置这些内容。这意味着您只需创建一次这些样式,而不需要在所有页面/屏幕上实现它们。
我希望这有帮助,