设置多种类型的WPF控件

时间:2009-11-20 09:40:01

标签: .net wpf xaml styles

我有一个包含几个(不同)项目的堆栈面板:

<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)更少冗余?

1 个答案:

答案 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在应用程序级别设置这些内容。这意味着您只需创建一次这些样式,而不需要在所有页面/屏幕上实现它们。

我希望这有帮助,

谢谢!