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>
Увеличить нижнее поле украшенного текстового поля. Я установил поле достаточно большим, чтобы освободить место для однорядного текстового блока / метки, а затем содержимое ниже было перемещено вниз