Пользовательский элемент управления с текстовым полем и текстовым блоком - PullRequest
0 голосов
/ 12 апреля 2019

Я хотел бы создать текстовое поле проверки, которое будет обычным UWP TextBox, заключенным в StackPanel, которое также содержит TextBlock. Намерение состоит в том, что сообщение проверки может быть показано ниже текстового поля, когда есть ошибка проверки.

Я знаю, что могу сделать это, создав пользовательский элемент управления, но для этого потребуется, чтобы я реализовал все нужные мне свойства и создал набор свойств зависимостей и т. Д.

Я надеюсь, что есть более простой способ, где я могу просто полностью извлечь текстовое поле, но переопределить шаблон отображения для него и добавить метку под ним.

1 Ответ

0 голосов
/ 13 апреля 2019

Большую часть пути можно получить в XAML, используя встроенный механизм проверки на основе IDataErrorInfo и определив шаблон элемента управления для Validation.ErrorTemplate TextBox. На есть хорошая статья:

Ниже следует XAML из статьи по ссылке выше, также ознакомьтесь с этим обсуждением встроенной проверки WPF здесь .

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