C# 为什么不';t我的错误模板是否正确包装我的已验证wpf控件

C# 为什么不';t我的错误模板是否正确包装我的已验证wpf控件,c#,wpf,validation,xaml,layout,C#,Wpf,Validation,Xaml,Layout,我对呈现验证模板有一个奇怪的问题。当我调整主窗口的大小时,错误模板在它们包装的控件上不稳定。文本框和组合框会发生这种情况 糟糕的渲染 好的渲染 错误模板 <ControlTemplate x:Key="ErrorTemplate"> <DockPanel> <Grid HorizontalAlignment="Right" DockPanel.Dock="Right" Width="16" Height="16" VerticalAl

我对呈现验证模板有一个奇怪的问题。当我调整主窗口的大小时,错误模板在它们包装的控件上不稳定。文本框和组合框会发生这种情况

糟糕的渲染

好的渲染

错误模板

  <ControlTemplate x:Key="ErrorTemplate">
    <DockPanel>
        <Grid HorizontalAlignment="Right" DockPanel.Dock="Right" Width="16" Height="16" VerticalAlignment="Center" Margin="3,0" Opacity="0.5">
            <Ellipse Width="16" Height="16" Fill="Red"/>
            <Ellipse Width="3" Height="8" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0 2 0 0" Fill="White"/>
            <Ellipse Width="2" Height="2" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0 0 0 2" Fill="White"/>
        </Grid>
        <Border BorderBrush="Red" BorderThickness="2" CornerRadius="2">
            <AdornedElementPlaceholder/>
        </Border>
    </DockPanel>
</ControlTemplate>

应用于组合框的样式

<Style TargetType="ComboBox">

    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ErrorTemplate}"/>

    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" 
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
        </Trigger>


    </Style.Triggers>
</Style>


我应用验证模板的方式是否存在明显的错误?

我也有类似的问题,我的控件有网格。IsSharedSizeScope=“True”,当视图正确加载控件时,错误模板保持不变。默认的WPF错误模板也出现了这种情况。我和装饰师玩了一段时间,但没有找到任何解决办法。最后我做到了:

<ControlTemplate x:Key="MyErrorTemplate">
  <Grid>
     <Border
         Width="{Binding ElementName=adornedElementPlaceholder, Path=AdornedElement.ActualWidth}"
         HorizontalAlignment="Left"
         BorderBrush="Red"
         BorderThickness="1"
         CornerRadius="0"
         RenderOptions.EdgeMode="Aliased"
         SnapsToDevicePixels="True">
         <Border
             BorderBrush="Transparent"
             BorderThickness="5"
             ToolTip="{Binding Path=[0].ErrorContent}" />
         </Border>
         <AdornedElementPlaceholder x:Name="adornedElementPlaceholder" Focusable="False" />
    </Grid>
</ControlTemplate>


关键是将边框的宽度绑定到装饰元素。我将水平对齐设置为左侧,当我将其设置为(原始)Strech时,它没有正确对齐边框。

我建议您下载Snoop,运行程序,然后检查Snoop中的元素。另一件事是我不喜欢在XAML中设置
网格的大小;我更喜欢让所有的尺寸都能满足可用空间。如果我必须在
网格中设置大小,我通常会设置列的宽度。网格的大小只是为了制作一个感叹号图标。我试过snoop,但它根本没有显示验证框。