Связывание FontSize TextBlock в Validation.ErrorTemplate - PullRequest
0 голосов
/ 26 сентября 2011

Я объявил простой 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 ]

1 голос
/ 26 сентября 2011

Почему бы вам не привязаться к 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>

Это не проверено, но должно работать:)

0 голосов
/ 26 сентября 2011

Другой вариант - обернуть 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>

Это будет работать для любого украшаемого элемента, независимо отразмер шрифта, любой для любой восклицательной графики (например, текста, пути, элемента и т. д.)

Позиционирование / макет можно настроить с полем.

...