为什么我的错误模板没有正确包装我验证的wpf控件

时间:2014-07-10 12:27:09

标签: c# wpf validation xaml layout

我对渲染验证模板有一个奇怪的问题。当我调整主窗口大小时,错误模板不会稳定它们包装的控件。这适用于文本框和组合框。

渲染错误

enter image description here

良好的渲染

enter image description here

错误模板

  <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>

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

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,我的控件有Grid.IsSharedSizeScope="True",并且当视图加载正确时,控件的大小已正确调整,但错误模板保持不变。默认的WPF错误模板也发生了这种情况。我和Adorners玩了一段时间,但没有找到任何解决方案。最后,我做到了:

<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时,它没有正确对齐边框。