【问题标题】:How do I make my TextBlocks be the correct sizes in my C# XAML Windows 8.1 app?如何使我的 TextBlocks 在我的 C# XAML Windows 8.1 应用程序中具有正确的大小?
【发布时间】:2015-07-02 06:48:05
【问题描述】:

我是 Windows 8.1 开发的新手,如果这个问题是显而易见的或初步的,请原谅我。我已经对各种属性进行了相当多的实验,但我无法让它按照我想要的方式工作,所以我想也许这里有人可以帮我一把。

我在做什么的描述: 我制作了一个 UserControl,这样我就可以为我正在尝试做的这件事隔离 UI,而且我可以在我真实 UI 的各个地方使用它。 UserControl 由一个Button 和一个Grid 组成。 Grid 有 3 行的定义,我希望行(以及它们包含的 Border 元素和 TextBlock 元素)占据总高度的 20%、高度的 60%,以及第 0、1 和 2 行分别为高度的 20%。我还希望Grid 占据Button 的整个高度。

这是 UserControl 的 XAML 标记,颜色艳丽,所以一切都在哪里很明显。

<UserControl
    x:Name="UserControlRoot"
    d:DesignHeight="300"
    d:DesignWidth="400"
    mc:Ignorable="d"
>
    <Grid x:Name="LayoutRoot" Margin="0" Background="Red">
        <Grid.Resources>
            <Style TargetType="TextBlock" x:Key="UCTextBlock">
                <Setter Property="FontSize" Value="20" />
                <Setter Property="TextAlignment" Value="Center" />
                <Setter Property="TextWrapping" Value="NoWrap" />
            </Style>
        </Grid.Resources>
        <!-- THIS BUTTON HAS SPACING AROUND IT - WHY? -->
        <Button 
            VerticalAlignment="Stretch"
            HorizontalAlignment="Stretch"
            BorderBrush="White"
            BorderThickness="5"
            Background="Green"
            Padding="0"
            Foreground="Blue"
            Margin="0"
        >
            <Grid Background="#ff333333">
                <Grid.RowDefinitions>
                    <RowDefinition Height="2*" />
                    <RowDefinition Height="6*" />
                    <RowDefinition Height="2*" />
                </Grid.RowDefinitions>

                <Border Grid.Row="0" HorizontalAlignment="Stretch">
                    <TextBlock Text="THIS IS MY RED TEXT" Foreground="LightCoral" Style="{StaticResource UCTextBlock}" />
                </Border>
                <Border Grid.Row="1" HorizontalAlignment="Stretch">
                    <TextBlock Text="THIS IS MY WHITE TEXT, NOT TALL" Foreground="White" Style="{StaticResource UCTextBlock}" />
                </Border>
                <Border Grid.Row="2" HorizontalAlignment="Stretch">
                    <TextBlock Text="THIS IS MY BLUE TEXT" Foreground="LightSkyBlue" Style="{StaticResource UCTextBlock}" />
                </Border>
            </Grid>
        </Button>
    </Grid>
</UserControl>

这是它在设计器中的样子:

请注意,第 1 行 (Height="6*") 中的白色文本是第 0 行和第 2 行的 3 倍。据我了解, Height="6*" vs Height="2*" 应该使第 1 行大于第 0 行和第 2 行。我显然在这里误解了一些明显的东西,但我不知道它是什么。

关于为什么 TextBlock 没有按照我想要的方式调整大小的任何想法? 没有影响任何元素样式的外部 DesignTemplates(据我所知,尽管我不确定是否有办法明确/详尽地确定这是否真的如此)。

一个几乎不相关的旁白:如果这对其他人有帮助,我发现在按钮上放置一个 Margin="0,-10" 将消除按钮周围的红色区域外部网格。花了一段时间才弄清楚这一点,所以希望它可以节省其他人一些时间。可能有一个 ThemeResource 具有相同的效果,但如果是这样我从未找到它。

【问题讨论】:

    标签: c# xaml windows-phone-8.1 winrt-xaml windows-8.1


    【解决方案1】:

    在 Button 中将水平和垂直内容对齐方式设置为 Stretch。这将拉伸内容网格。

    <Button HorizontalContentAlignment="Stretch" ...
    </Button>
    

    【讨论】:

    • 感谢@JamesLucas 的提示!
    【解决方案2】:

    TL;DR:将 HorizontalContentAlignmentVerticalContentAlignment 设置为 Stretch

    按钮中的ContentPresenterHorizontalAlignmentVerticalAlignment 属性分别绑定到HorizontalContentAlignmentVerticalContentAlignment 属性。您可以在MSDN 上的默认控件模板中看到这一点。

    <Grid>
    ...
    <Border x:Name="Border"
          Background="{TemplateBinding Background}"
          BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}"
          Margin="3">
         <ContentPresenter x:Name="ContentPresenter"
                         Content="{TemplateBinding Content}"
                         ContentTransitions="{TemplateBinding ContentTransitions}"
                         ContentTemplate="{TemplateBinding ContentTemplate}"
                         Margin="{TemplateBinding Padding}"
                         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                         VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                          AutomationProperties.AccessibilityView="Raw"/>
                    </Border>
                    ...
                </Grid>
    

    因为您的Grid 实际上是内容呈现器内部,所以它填充了该空间(而不是按钮的整个空间)。通过将这些属性设置为Stretch,您可以让ContentPresenter 填充可用空间,Grid 也会这样做,从而为您提供正确的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多