我有一张带有几个标签的表格:
<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包含空字符串,则一切都按预期工作。
当前行为:
预期结果:
我目前在每个TargetNullValue={}
的绑定中使用Label
,以防止控件被折叠。但我希望有一个解决方案,允许我在Label
中使用StackPanel
控件,我可以使用Style
来防止崩溃,而不必设置TargetNullValue
每个Label
的每个绑定中的属性。
答案 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>