Перекрытие шаблона контроля валидации WPF - PullRequest
4 голосов
/ 29 июня 2011

У меня есть пользовательский элемент управления с шаблоном элемента управления для отображения ошибок проверки, шаблон проверки:

<ControlTemplate x:Key="TextBoxPropertyValidationTemplate">
        <StackPanel>
            <Border BorderBrush="Red" BorderThickness="1">
                <AdornedElementPlaceholder x:Name="MyAdorner" />
            </Border>

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" MaxHeight="16" MaxWidth="16"
                       Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
                       Margin="1" RenderOptions.BitmapScalingMode="HighQuality"
                       VerticalAlignment="Center" HorizontalAlignment="Center" />
                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left"
                           Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                           TextWrapping="Wrap" Grid.Column="1" FontSize="10" Foreground="Red" />
            </Grid>

        </StackPanel>
    </ControlTemplate>

И я не могу обойти довольно раздражающую проблему, которая выглядит следующим образом:

validation

Я пытался поэкспериментировать с полями в пользовательском элементе управления и в шаблоне, а также с некоторым значением Height = Auto и т. Д., Но все это не очень помогает.Любые идеи кто-нибудь?

Если это помогает основной пользовательский элемент управления (который объединяет с проверкой) находится в TabItem с AdornerDecorator.

Любая помощь приветствуется.

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Я бы сказал, что это потому, что ваше сообщение об ошибке находится на AdornerLayer, который не участвует в том же макете, что и ваш элемент управления. MSDN говорит «рендеринг рекламного элемента не зависит от рендеринга элемента UIE, с которым он связан». и именно поэтому сообщение просто помещено поверх всего.

Вы можете поместить текст ошибки в исходный шаблон, скрыть его на основе Validation.HasError и таким образом включить его в процесс верстки.

Но изменение макета элемента управления может быть не лучшим способом, если возникает ошибка проверки. Вы можете рассмотреть возможность предоставления дополнительной информации в подсказке.

1 голос
/ 09 августа 2016

Альтернативно, вместо использования ControlTemplate, вы можете поместить сообщение об ошибке TextBlock рядом с TextBox и установить его свойство Text, связывающее ErrorContent TextBox.

...