WPF ControlTemplate Высота

У меня есть следующий стиль для проверки ввода в моих элементах управления:

<Style x:Key="MyErrorTemplate" TargetType="Control">
    <Style.Setters>
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate x:Name="ControlErrorTemplate">
                    <StackPanel Orientation="Vertical" Height="Auto">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
                            <AdornedElementPlaceholder x:Name="Holder"/>
                        </StackPanel>
                        <Label Foreground="Red" Content="{Binding ElementName=Holder, 
                            Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>

Если происходит ошибка, сообщение об ошибке в метке появляется под элементом управления (например, текстовое поле) и перекрывает элемент управления ниже. Я сделал StackPanel's Height="Авто", но это не помогло. Каждый элемент управления находится в ячейке сетки, а высота строки сетки также равна Авто. Не могли бы вы сказать мне, что мне не хватает? Я хочу, чтобы сообщение об ошибке выдавило то, что внизу. Благодарю.

2 ответа

Решение

Validation.ErrorTemplate показывает обратную связь об ошибке на слое Adorner. Это означает, что все элементы управления в этом шаблоне не будут учитываться, когда система макетов измеряет и размещает элементы управления на слое украшенных элементов.

Я нашел это и спасибо LPL, я не знал это о слое adorner.

Мое решение было маржинальным "взломом". Я просто использовал триггер:

    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="Margin" Value="0,0,0,28"/>
        </Trigger>
    </Style.Triggers> 

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

Другие вопросы по тегам