我们可以使用哪种控件组合来指示必填字段?

时间:2013-09-04 09:10:17

标签: wpf

我已经找到了三种表示强制字段标签的方法。但我不确定谁的用途是理想的。一个要求是标签应该支持访问密钥。请帮助我了解应该使用哪些。另外的建议也很受欢迎。

<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>

2 个答案:

答案 0 :(得分:0)

如果我选择您的一个示例,我会选择第一个,但如果没有,那么我会使用Attached Property代替:

<TextBox Text="{Binding SomeProperty}" Attached:TextBoxProperties.IsMandatory="True" />

当然,你会遇到创建Attached Property的小问题,但红色的星号(*)是所以的最后时代。我的IsMandatory属性在TextBox为空时基本上会显示一条消息,但这是WPF ...您可以添加红色星号或其他任何您能想象的内容。您甚至可以使用此Attached Property在我的示例中添加星号到Label而不是TextBox

我的Attached Property与我的LabelLabelColour 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