在 Validation.ErrorTemplate 中绑定 TextBlock 的字体大小

本文关键字:字体 TextBlock 绑定 Validation ErrorTemplate | 更新日期: 2023-09-27 18:09:45

我声明了一个简单的Validation.ErrorTemplate for 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 的字体(编辑(大小相同,但它不会导致预期,并且始终获得默认字体大小。此外,我尝试使用 RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FontSize 绑定,但它也无法解决问题。为什么会出现这种情况?如何使感叹号的大小与文本框相同?

在 Validation.ErrorTemplate 中绑定 TextBlock 的字体大小

为什么不绑定到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>

然后,这将适用于任何正在装饰的元素,无论字体大小如何,任何感叹号图形(即文本,路径,元素等(

定位/布局可以用边距进行调整。