3

我有以下控件模板,我将其Validation.ErrorTemplate用作 TextBoxes:-

<ControlTemplate x:Key="ControlValidationErrorTemplate">
  <DockPanel LastChildFill="True">
    <Border Background="Red"
            DockPanel.Dock="right"
            Padding="2,0,2,0"
            ToolTip="{Binding ElementName=valAdorner, Path=AdornedElement.(Validation.Errors), Converter={x:Static val:ValidationErrorsConverter.Instance}}">
      <TextBlock Text="!"
                 VerticalAlignment="center"
                 HorizontalAlignment="center"
                 FontWeight="Bold"
                 Foreground="white" />
    </Border>
    <AdornedElementPlaceholder x:Name="valAdorner"
                               VerticalAlignment="Center">
      <Border BorderBrush="red"
              BorderThickness="1" />
    </AdornedElementPlaceholder>
  </DockPanel>
</ControlTemplate>

当 TextBox 包含无效内容时,上述模板应用红色边框,并在 TB 右侧立即添加一个包含感叹号的红色框。

问题是,感叹号与 TB 右侧的任何内容重叠,而不是更改布局以适应感叹号。我在 DataGrids 中遇到了类似的问题 - 感叹号与包含单元格的右侧边缘重叠,而不是增加列宽以适应它。

使用 Snoop,模板似乎显示在“装饰层”中,我认为这是一个单独的可视化树?这可以解释为什么不重新计算窗口的布局以考虑感叹号。任何人都可以提出一种方法来实现我想要的吗?

4

1 回答 1

4

正如我所怀疑的,这是由于在装饰层上呈现了错误模板,因此它不会影响窗口的布局。请参阅:http ://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9de3c9e5-5759-4f88-9184-175d3eaabdad/

我现在改用这个控制模板:-

<ControlTemplate x:Key="ControlValidationErrorTemplate">
  <Grid>
    <Polygon Points="9,9 9,0 0,0"
             Stroke="Red"
             StrokeThickness="1"
             Fill="Red"
             HorizontalAlignment="Right"
             VerticalAlignment="Top"
             ToolTip="{Binding ElementName=valAdorner, Path=AdornedElement.(Validation.Errors), Converter={x:Static val:ValidationErrorsConverter.Instance}}" />
    <AdornedElementPlaceholder x:Name="valAdorner"
                               VerticalAlignment="Center">
      <Border BorderBrush="red"
              BorderThickness="1" />
    </AdornedElementPlaceholder>
  </Grid>
</ControlTemplate>

这会在控件周围绘制一个红色边框,一个小的红色三角形与控件的右上角重叠 - 将鼠标悬停在该控件上会显示一个包含错误消息的工具提示。

于 2013-04-17T13:58:50.350 回答