是否有一个容器,我可以在其中定位许多元素的样式

时间:2012-07-04 15:52:52

标签: wpf

在WPF中有容器就像HTML div(这很容易),在那里我可以定位该容器中的所有文本块?所以我不必在每个文本块上指定样式吗?

我有一个复杂的画布,我想在一个区域中定位文本块。

对此产生影响(StackPanel以外的其他东西可用作样式定位容器):

            <StackPanel>
            <StackPanel.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground" Value="White"></Setter>
                    <Setter Property="FontFamily" Value="Arial"></Setter>
                </Style>
            </StackPanel.Resources>

            <TextBlock Canvas.Left="87" Canvas.Top="210">
            mytext1
            </TextBlock>
            <TextBlock Canvas.Left="87" Canvas.Top="232">
            mytext2
            </TextBlock>
            <TextBlock Canvas.Left="87" Canvas.Top="254">
            mytext2
            </TextBlock>
        </StackPanel>

因此,如果我尝试网格,画布坐标将被忽略,我的文本块将出现在画布的顶部。

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
<Canvas Width="500" Height="500">
    <Grid>
        <Grid.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Foreground" Value="Red"></Setter>
            </Style>
        </Grid.Resources>
    <TextBlock Text="MyTextBlock1" Canvas.Left="300" Canvas.Top="300">
    </TextBlock>
    </Grid>
</Canvas>

1 个答案:

答案 0 :(得分:0)

在这种情况下,您使用画布坐标在左侧给出87个间距,在元素的顶部之间给出22个间距。 StackPanel已经一个接一个地布置项目。您只需设置文本块的边距

    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Foreground" Value="Red"></Setter>
                <Setter Property="FontFamily" Value="Arial"></Setter>
                <Setter Property="FontSize" Value="14" />
                <Setter Property="Margin" Value="87,4, 0, 4" />
            </Style>
        </StackPanel.Resources>
        <TextBlock>mytext1</TextBlock>
        <TextBlock>mytext2</TextBlock>
        <TextBlock>mytext3</TextBlock>
    </StackPanel>

要回答您的问题,您可以在任何希望隔离“资源”部分的地方使用网格控件(或Canvas或任何其他元素)。网格不执行任何布局。

<StackPanel>
        <StackPanel.Resources>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Foreground" Value="White"></Setter>
                <Setter Property="FontFamily" Value="Arial"></Setter>
            </Style>
        </StackPanel.Resources>

        <TextBlock>
            mytext1
        </TextBlock>
        <Canvas>
            <Canvas.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground" Value="Red"></Setter>
                    <Setter Property="FontFamily" Value="Times"></Setter>
                </Style>
            </Canvas.Resources>
            <TextBlock Canvas.Left="87" Canvas.Top="210">mytext2</TextBlock>
            <TextBlock Canvas.Left="87" Canvas.Top="232">mytext2</TextBlock>
        </Canvas>
    </StackPanel>