WPF 验证控制模板重叠

hyp*_*hyp 5 validation wpf adorner controltemplate

我有一个带有控件模板的用户控件来显示验证错误,验证模板:

<ControlTemplate x:Key="TextBoxPropertyValidationTemplate">
        <StackPanel>
            <Border BorderBrush="Red" BorderThickness="1">
                <AdornedElementPlaceholder x:Name="MyAdorner" />
            </Border>

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" MaxHeight="16" MaxWidth="16"
                       Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
                       Margin="1" RenderOptions.BitmapScalingMode="HighQuality"
                       VerticalAlignment="Center" HorizontalAlignment="Center" />
                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left"
                           Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                           TextWrapping="Wrap" Grid.Column="1" FontSize="10" Foreground="Red" />
            </Grid>

        </StackPanel>
    </ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

而且我似乎无法解决一个看起来像这样的令人恼火的问题:

验证

我一直在尝试使用用户控件和模板上的边距,还有一些 Height=Auto 等,但所有这些都没有真正的帮助。任何人的想法?

如果这有助于主用户控件(嵌套带有验证的控件)位于带有 AdornerDecorator 的 TabItem 中。

任何帮助表示赞赏。

Bot*_*000 5

我会说这是因为您的错误消息在 上AdornerLayer,它不参与与您的控件相同的布局。MSDN 说“装饰器的渲染独立于装饰器绑定到的 UIElement 的渲染。” 这就是为什么信息只是放在一切之上的原因。

您可以将错误文本放入原始模板中,将其隐藏并以Validation.HasError这种方式将其包含在布局过程中。

但是,如果发生验证错误,更改控件的布局可能不是最好的方法。您可以考虑在工具提示中提供附加信息。