我已经找到了三种不同的方法来表示必填字段标签。但是我不确定谁的用途是理想的。一个要求是标签应支持访问密钥。请帮助我了解应该使用其中的哪些。其他建议也值得赞赏。
<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>
如果我必须选择您的示例之一,我会选择第一个,但如果没有,那么我将为此使用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
属性提供了一个简单的ControlTemplate
(这是带有额外TextBlock
的默认TextBox
模板(,它从App.xaml
页面读取。LabelColour
属性只允许我为额外的TextBlock
选择不同的Foreground
颜色,但在使用 IsMandatory
属性时内部设置为Red
。
我的观点是:你可以像你之前的许多星号一样使用旧的红色星号,或者你可以扩展并利用 WPF 提供的功能来提出更好的解决方案。
应该使用"是相对的。例如,我们可以从性能的角度来思考。这可能意味着使用一个可以提供较小可视化树的版本。通常,文本块对此非常轻巧,但缺少目标属性,因此访问键不起作用。从您的解决方案来看,第三个比第二个更好,因为它直接包含 StackPanel,周围没有包裹标签。运行文本元素的第一个解决方案似乎很优雅,我更喜欢它。关于您想要实现的功能,我会将文本框本身标记为必需的,例如在绑定上使用验证规则。这样,标记可以随着用户键入而出现和消失。参见示例:http://www.nbdtech.com/Blog/archive/2010/07/05/wpf-adorners-part-3-ndash-adorners-and-validation.aspx。另外,关于可视化树和决定使用哪些控件,我推荐Snoop工具:http://snoopwpf.codeplex.com。