【问题标题】:Is there a container where I can target the styles of a number of elements是否有一个容器可以定位多个元素的样式
【发布时间】:2012-07-05 01:02:48
【问题描述】:

在 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>

【问题讨论】:

  • 你的意思是不只是使用网格?
  • 目前还不清楚为什么你不能只做你在第一个例子中所做的事情。至于使用Grid 的问题,您需要将Canvas 附加属性移动到Grid 而不是TextBlock,因为Canvas 只会在其中查找这些属性直系子女。
  • 你能提供更多关于你想要达到的目标的信息吗?通常我会使用StyleSelector 来实现这一点,但目前无法在不设置附加属性的情况下告诉哪些 TextBlocks 也应用样式(因此您也可以直接应用样式 E.G. Style={StaticResource myStyle}) .我觉得ItemsControl 在这里很有用,但需要了解更多关于您的要求。你需要的布局图也很好。
  • 就像我说的,画布有一个复杂的布局,其中放置了许多项目。然后在画布的某些区域内,我希望全局(呵呵)应用样式,这样我就可以避免在每个 TextBlock 上都有一个 Style={StaticResource myStyle}。
  • “一个复杂的布局,其中放置了许多项目”并没有给我更多信息。我的理解是,您所追求的行为与使用 ItemsControlDataTemplates 可实现的行为相同。

标签: wpf


【解决方案1】:

在这种情况下,您使用画布坐标在左侧提供 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>

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

<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>

【讨论】:

  • 谢谢。但是请看我在上面网格上的笔记。
  • 我尝试了您的代码,并且在 StackPanel 中也忽略了 Canvas 坐标,您只是碰巧编写了坐标,该坐标可以像 stackpanel 一样塑造画布。如果你想要做的只是将一堆文本框排列起来,它们之间有 22 个凹陷,你可以使用上面添加的编辑代码,如果你坚持手动定位你的元素,这在 xaml 中是非常不习惯的,你可以使用一个 Canvas 元素,而不是我推荐的网格
  • 是的,知道这一切。我使用的例子只是示范性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2022-10-30
  • 1970-01-01
  • 2012-07-30
相关资源
最近更新 更多