3

Validation.ErrorTemplateTextBoxesとして使用する次のコントロール テンプレートがあります。

<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

私が推測したように、それはエラー テンプレートが adorner レイヤーにレンダリングされているためであり、ウィンドウのレイアウトには影響しません。参照: 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 に答える