2

TextBoxに使用されるカスタムツールチップコントロールを作成しようとしています。

次のようになります。

ここに画像の説明を入力してください

...私が可能な限りよく見た背景コンポーネントから来るいくつかのピクセルを除いて。

アイデアは次のとおり です。WPFアプリケーションにバルーンメッセージを実装する方法

問題は、カスタムコントロールの背後にあるコードが検証オブジェクトを取得しないことです(generic.xamlのトリガーを介して渡される必要があります)。

なぜだめですか?

generic.xaml:

  <Style TargetType="{x:Type TextBox}" x:Name="tb">
        <Setter Property="Width" Value="200" />
        <Setter Property="Background" Value="{StaticResource InputBackgroundColor}" />
        <Setter Property="BorderBrush" Value="{StaticResource InputBorderBrush}" />
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="Margin" Value="5,0,0,5" />
    <Style.Triggers>
      <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip">
          <Setter.Value>
            <Windows:ValidationBalloonPopupWindow
              Validation="{Binding Path=Validation, ElementName=tb}" />
          </Setter.Value>
        </Setter>
      </Trigger>
    </Style.Triggers>
  </Style>

ご覧のとおり、tbのElementNameを使用して検証を参照しようとしています。Nameはテンプレートで使用されていないようです。代わりにx:Keyに変更すると、すべてのテキストボックスの幅が10ピクセルのようになります。言い換えれば、おそらく正しいことではありません。

背後にあるコード、ValidationBalloonPopupWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace Foo.ToolTips
{
    public partial class ValidationBalloonPopupWindow : ToolTip
    {
        public ValidationBalloonPopupWindow()
        {
            InitializeComponent();
        }    

        public static DependencyProperty ValidationProperty
            = DependencyProperty.Register("Validation", typeof(object), typeof(ValidationBalloonPopupWindow),
                new PropertyMetadata(null, OnChangedValidationByBinding));

        private static void OnChangedValidationByBinding
            (DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((ValidationBalloonPopupWindow)d).OnChangedValidationByBinding(e.NewValue);
        }
        public void OnChangedValidationByBinding(object newValue)
        {
            txtMessage.Text = newValue.GetType().Name;
        }

        private object _validation;
        public object Validation
        {
            get
            {
                return _validation;
            }
            set
            {
                _validation = value;
                txtMessage.Text = _validation.GetType().Name;
            }
        }
    }
}

実行する必要のあるセッターがありますが、このファイルに多くのブレークポイントを設定しようとしましたが、成功しませんでした。

コントロール自体のxaml、ValidationBalloonPopupWindow.xaml:

<ToolTip x:Class="FRAM.Windows.ValidationBalloonPopupWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Background="Transparent" BorderBrush="Transparent" HasDropShadow="false"
    Placement="Bottom"
    Height="Auto" Width="Auto">
  <Grid Height="126" Width="453">
    <Border Margin="7,13,0,0"
          CornerRadius="10,10,10,10" Grid.ColumnSpan="4" HorizontalAlignment="Left" Width="429" Height="82" VerticalAlignment="Top" Grid.RowSpan="2">
      <Border.Effect>
        <DropShadowEffect Color="#FF474747" />
      </Border.Effect>
      <Border.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
          <GradientStop Color="#FF58C2FF" Offset="0" />
          <GradientStop Color="#FFFFFFFF" Offset="1" />
        </LinearGradientBrush>
      </Border.Background>
      <StackPanel Orientation="Vertical">
        <Label Content="Title" Height="31" HorizontalAlignment="Left"
          Margin="12,8,0,0" Name="lblCaption" FontSize="16" FontWeight="Bold" />
        <TextBlock Margin="18,0,0,0" Name="txtMessage" Width="378" HorizontalAlignment="Left">Body</TextBlock>
      </StackPanel>
    </Border>
    <Path Data="M25,25L10.9919,0.64 0.7,25" Fill="#FF58C2FF" HorizontalAlignment="Left"
      Margin="32,3,0,0" Stretch="Fill" Width="22" Height="10" VerticalAlignment="Top" />
  </Grid>
</ToolTip>
4

1 に答える 1

2

RelativeSource名前で参照する代わりに、バインディングを使用してテキストボックス自体を取得します。
次のようなものを試してください。

<Setter Property="ToolTip">
    <Setter.Value>
       <Windows:ValidationBalloonPopupWindow
           Validation="{Binding RelativeSource={RelativeSource Self}, Path=Validation}" />
    </Setter.Value>
</Setter>
于 2012-12-19T15:41:22.577 に答える