WPF:VerticalAlignment是否由嵌套容器继承?

时间:2010-03-08 05:11:14

标签: wpf

我希望嵌套容器继承该属性,但是当我将它设置在最外面的容器时,我不确定它是否正常工作。它要么正在工作,但我没有得到我想要的结果,或者我可能必须在某个地方设置一个属性才能携带。

假设a)有可能做到这一点b)我必须在某个地方改变一个属性,这会产生任何我应该注意的副作用吗?

编辑

好的,这是一个例子:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Width="300" Height="100">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0" Grid.Column="0">Text</Label>
        <TextBox Grid.Row="0" Grid.Column="1">I'm on the Internet</TextBox>
        <Button Grid.Row="0" Grid.Column="2">Don't click me</Button>
        <Label Grid.Row="1" Grid.Column="0">Text2</Label>
        <Slider Grid.Row="1" Grid.Column="1"></Slider>
        <Button Grid.Row="1" Grid.Column="2">Click the other guy</Button>
    </Grid>
</Window>

我想拥有的,无需手动操作:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Width="300" Height="100">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Label VerticalAlignment="Center" Grid.Row="0" Grid.Column="0">Text</Label>
        <TextBox VerticalAlignment="Center" Grid.Row="0" Grid.Column="1">I'm on the Internet</TextBox>
        <Button VerticalAlignment="Center" Grid.Row="0" Grid.Column="2">Don't click me</Button>
        <Label VerticalAlignment="Center" Grid.Row="1" Grid.Column="0">Text2</Label>
        <Slider VerticalAlignment="Center" Grid.Row="1" Grid.Column="1"></Slider>
        <Button VerticalAlignment="Center" Grid.Row="1" Grid.Column="2">Click the other guy</Button>
    </Grid>
</Window>

虽然我不确定这里有什么不同。这不是交易破坏者或任何事情,但我想这样做。

1 个答案:

答案 0 :(得分:1)

VisualTree继承不是通用的。依赖项属性指定它在声明时将继承可视树。在这种情况下,verticalalignment不是。

获得一致垂直对齐的唯一方法是使用样式。并且您不能在不同类型的控件中使用隐式样式。因此,您需要创建一个命名样式,将其放在容器的资源中。在样式中添加一个setter,将垂直对齐设置为您想要的任何值。最后引用要应用它的所有控件中的样式。

以下是您使用样式完成的示例...遗憾的是,您不会节省太多的输入,但是如果您的样式执行类似Set VerticalAlignment和FontFamily的操作,那么您将节省空间...如果您认为它像CSS一样那么WPF样式很容易。

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test" Width="300" Height="100"> 
    <Grid ShowGridLines="True"> 
        <Grid.RowDefinitions> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <Grid.Resources>
            <Style x:Key="setVA" TargetType="{x:Type Control}">
                <Setter Property="VerticalAlignment" Value="Center"/>
            </Style>
        </Grid.Resources>
        <Label Style="{StaticResource setVA}" Grid.Row="0" Grid.Column="0">Text</Label> 
        <TextBox Style="{StaticResource setVA}" Grid.Row="0" Grid.Column="1">I'm on the Internet</TextBox> 
        <Button Style="{StaticResource setVA}" Grid.Row="0" Grid.Column="2">Don't click me</Button> 
        <Label Style="{StaticResource setVA}" Grid.Row="1" Grid.Column="0">Text2</Label> 
        <Slider Style="{StaticResource setVA}" Grid.Row="1" Grid.Column="1"></Slider> 
        <Button Style="{StaticResource setVA}" Grid.Row="1" Grid.Column="2">Click the other guy</Button> 
    </Grid> 
</Window> 

有关using styles on MSDN

的更多信息