如何防止带有空内容的标签折叠?

时间:2016-04-02 01:03:56

标签: c# .net wpf xaml

我有一张带有几个标签的表格:

<StackPanel Margin="20">
    <Label Padding="0" Content="1" />
    <Label Padding="0" />
    <Label Padding="0" Content="3" />
    <Label Padding="0" Content="4" />
</StackPanel>

当label有空内容(绑定返回null)时,它会折叠。怎么预防?如果Content包含空字符串,则一切都按预期工作。

当前行为:

enter image description here

预期结果:

enter image description here

我目前在每个TargetNullValue={}的绑定中使用Label,以防止控件被折叠。但我希望有一个解决方案,允许我在Label中使用StackPanel控件,我可以使用Style来防止崩溃,而不必设置TargetNullValue每个Label的每个绑定中的属性。

3 个答案:

答案 0 :(得分:2)

StackPanel不会给孩子提供超出他们要求的空间。 Label控件如果没有内容且您没有明确设置尺寸,则不会要求任何空格。请注意,设置Height对于您声明的目的就足够了,但当然Label的视觉高度不取决于内容,而是取决于明确的设置。

我相信你现在使用的解决方案是合理的。它确保内容实际上永远不会null,因此Label控件将始终要求高度以容纳给定内容。即使字符串为空。

您在评论中表示,您希望能够通过Style应用此解决方法。如果您愿意更改模型绑定的目标属性,只需将模型绑定到Label.DataContext属性,然后让Style设置Content即可。 DataContext

例如:

<Window x:Class="TestSO36368066NonCollapseLabel.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:TestSO36368066NonCollapseLabel"
        Title="MainWindow" Height="350" Width="525">
  <Window.DataContext>
    <l:Model Text1="label 1" Text3="label 3"/>
  </Window.DataContext>

  <Window.Resources>
    <p:Style TargetType="Label">
      <Setter Property="Padding" Value="0"/>
      <Setter Property="Content" Value="{Binding TargetNullValue={}}"/>
    </p:Style>
  </Window.Resources>

  <StackPanel>
    <Label DataContext="{Binding Text1}"/>
    <Label DataContext="{Binding Text2}"/>
    <Label DataContext="{Binding Text3}"/>
  </StackPanel>
</Window>

示例模型类当然只有三个简单的string属性:

class Model
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
    public string Text3 { get; set; }
}

当然,您可以使用任何模型,并且在您的情况下绑定是合适的。

我发现DataContext特别方便,因为它使XAML绑定语法非常简单;绑定的默认源是DataContext本身,因此您需要指定的是TargetNullValue属性。但是,如果由于某种原因您不想直接在DataContext中存储源代码值,则可以根据需要使用Tag属性代替DataContext。或者就此而言,您可以创建一个全新的视图模型,将 绑定到DataContext,然后像往常一样绑定到Style中的模型属性。重要的是Style具有一致的源属性,因此Style可以应用于所有Label个对象。

答案 1 :(得分:0)

您可以使用将其高度设置为auto并将MinHeight设置为10或其周围某些行的行来执行网格

答案 2 :(得分:0)

<Label Padding="0" >
    <Label.Style>
        <Style TargetType="Label">
            <Style.Triggers>
                <Trigger Property="Content" Value="{x:Null}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="Label">
                                <Label Padding="0" Content=" "/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
</Label>