Связывание FontSize TextBlock в Validation.ErrorTemplate
Я объявил простой Validation.ErrorTemplate для TextBox следующим образом.
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock Text="!" DockPanel.Dock="Right"
FontSize="{TemplateBinding TextBox.FontSize}"
Foreground="Red"/>
<AdornedElementPlaceholder Name="adornerPlaceholder" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Я ожидаю, что размер шрифта восклицательного знака будет такого же размера (отредактированного) шрифта, что и TextBox, но это не приводит к ожиданию и всегда получает размер шрифта по умолчанию. Кроме того, я попробовал Binding, используя RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FontSize
, но это также не может решить проблему. Почему возникла такая ситуация? Как я могу сделать так, чтобы восклицательный знак получал тот же размер, что и TextBox?
2 ответа
Почему бы вам не связать с AdornedElementPlaceholder
?
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock Text="!" DockPanel.Dock="Right"
FontSize="{Binding ElementName=adornerPlaceholder, Path=AdornedElement.FontSize}"
Foreground="Red"/>
<AdornedElementPlaceholder Name="adornerPlaceholder" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Это не проверено, но это должно работать:)
Другим вариантом является завернуть TextBlock
в Viewbox
, который автоматически масштабирует свою высоту вместе с украшенным элементом:
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Viewbox DockPanel.Dock="Right"
Height="{Binding ElementName=adornerPlaceholder, Path=ActualHeight}"
Stretch="Uniform"
Margin="5 0">
<TextBlock Text="!" Foreground="Red" />
</Viewbox>
<AdornedElementPlaceholder Name="adornerPlaceholder" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Это будет работать для любого элемента, который будет украшен, независимо от размера шрифта, для любого восклицательного изображения (например, текст, путь, элемент и т. Д.)
Позиционирование / макет могут быть изменены с запасом.