【问题标题】:Custom control with text box and text block带有文本框和文本块的自定义控件
【发布时间】:2019-04-13 13:34:02
【问题描述】:

我想构建一个验证文本框,它是一个普通的 UWP TextBox,包裹在一个 StackPanel 中,其中还包含一个 TextBlock。目的是当出现验证错误时,可以在文本框下方显示验证消息。

我知道我可以通过创建自定义控件来做到这一点,但这需要我实现我需要的所有属性并创建一堆依赖属性等。

我希望有一种更简单的方法,我可以完全派生文本框,但覆盖它的显示模板并在其下方包含一个标签。

【问题讨论】:

  • 你熟悉 TemplatedControl 吗?
  • 请查看TextBoxRegex XAML来自社区工具包的属性。

标签: xaml uwp custom-controls uwp-xaml


【解决方案1】:

您可以使用内置的基于 IDataErrorInfo 的验证机制并为 TextBox 的 Validation.ErrorTemplate 定义控件模板,从而在 XAML 中获得大部分方法。 this link:有一篇不错的文章

上面链接中文章中的 XAML 如下所示,还可以查看有关 WPF 内置验证 here 的讨论。

<Style TargetType="{x:Type Label}">
    <Setter Property="Margin" Value="5,0,5,0" />
    <Setter Property="HorizontalAlignment" Value="Left" />
</Style>
<Style TargetType="{x:Type TextBox}">
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="Margin" Value="0,2,40,2" />
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="true">
                    <Border Background="OrangeRed" DockPanel.Dock="right" Margin="5,0,0,0" 
                            Width="20" Height="20" CornerRadius="5"
                            ToolTip="{Binding ElementName=customAdorner, 
                                      Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                    <TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" 
                               FontWeight="Bold" Foreground="white" />
                    </Border>
                    <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
                        <Border BorderBrush="red" BorderThickness="1" />
                    </AdornedElementPlaceholder>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

  • 不确定投反对票的目的是什么,因为答案符合 OP 的要求并使用内置机制,而不必自己动手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多