我已经找到了三种表示强制字段标签的方法。但我不确定谁的用途是理想的。一个要求是标签应该支持访问密钥。请帮助我了解应该使用哪些。另外的建议也很受欢迎。
<Label Width="200" HorizontalAlignment="Left" Target="{Binding ElementName=mytb}">
<TextBlock>
<Run Text="*" Foreground="Red" FontWeight="Heavy" />
<AccessText Text="_Name"/>
</TextBlock>
</Label>
<Label VerticalAlignment="Center" HorizontalAlignment="Center" Target="{Binding ElementName=mytb}">
<StackPanel Orientation="Horizontal" Grid.Row="17" Grid.Column="0" HorizontalAlignment="Right">
<TextBlock Text="*" Foreground="Red" VerticalAlignment="Center" FontWeight="Heavy"></TextBlock>
<AccessText Text="_Name:" />
</StackPanel>
</Label>
<StackPanel Orientation="Horizontal">
<TextBlock Text="*" Foreground="Red" VerticalAlignment="Center" FontWeight="Heavy"/>
<Label Content="_Name" VerticalAlignment="Center" Target="{Binding ElementName=mytb}"/>
</StackPanel>
答案 0 :(得分:0)
如果我有选择您的一个示例,我会选择第一个,但如果没有,那么我会使用Attached Property
代替:
<TextBox Text="{Binding SomeProperty}" Attached:TextBoxProperties.IsMandatory="True" />
当然,你会遇到创建Attached Property
的小问题,但红色的星号(*)是所以的最后时代。我的IsMandatory
属性在TextBox
为空时基本上会显示一条消息,但这是WPF ...您可以添加红色星号或其他任何您能想象的内容。您甚至可以使用此Attached Property
在我的示例中添加星号到Label
而不是TextBox
。
我的Attached Property
与我的Label
和LabelColour
Attached Properties
一起使用,每个都添加了额外的功能...... Label
属性提供了一个简单的{{ 1}}(这是带有额外ControlTemplate
的默认TextBox
模板),它从TextBlock
页面读取。 App.xaml
属性只允许我为额外LabelColour
选择不同的Foreground
颜色,但在使用TextBlock
属性时内部设置为Red
。
我的观点是这样的:你可以在你之前使用旧的红色星号,或者你可以分支并利用WPF提供的功能想出一个更好的解决方案。
答案 1 :(得分:0)
“应该使用”是相对的。例如,我们可以考虑性能。这可能意味着使用可以提供较小可视树的版本。通常情况下,Textblock相当亮,但缺少Target属性,因此访问键不起作用。 从您的解决方案中,第三个比第二个更好,因为它直接包含StackPanel而没有标签缠绕它。使用Run文本元素的第一个解决方案看起来很优雅,我更喜欢这个。 关于您想要实现的功能,我将TextBox本身标记为必需,例如在绑定上使用验证规则。这样,标记可以在用户键入时出现和消失。请参阅示例:http://www.nbdtech.com/Blog/archive/2010/07/05/wpf-adorners-part-3-ndash-adorners-and-validation.aspx。 另外,关于可视化树和决定使用哪些控件,我推荐使用Snoop工具:http://snoopwpf.codeplex.com。