Xaml 带有文本框和文本块的自定义控件

Xaml 带有文本框和文本块的自定义控件,xaml,uwp,custom-controls,uwp-xaml,Xaml,Uwp,Custom Controls,Uwp Xaml,我想构建一个验证文本框,它将是一个普通的UWPTextBox包装在StackPanel中,它还包含一个TextBlock。其目的是当出现验证错误时,可以在文本框下方显示验证消息 我知道我可以通过创建一个自定义控件来实现这一点,但这需要我实现所有需要的属性,并创建一组依赖属性,等等 我希望有一种更简单的方法,我可以完全派生文本框,但可以覆盖文本框的显示模板,并在其下方包含一个标签。使用内置的基于IDataErrorInfo的验证机制并为文本框的validation.ErrorTemplate定义一

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

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


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

使用内置的基于IDataErrorInfo的验证机制并为文本框的validation.ErrorTemplate定义一个控件模板,您可以在XAML中获得大部分方法。这里有一篇很好的文章

下面是上面链接中文章中的XAML,也可以查看关于WPF内置验证的讨论



您熟悉TemplatedControl吗?请检查来自社区工具包的属性。由于答案符合OP的要求,并且使用内置机器,而不必自己滚动,因此不确定否决票是为了什么。
<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>