2011-07-05 17 views
1

ツールチップのヘッダーのラベルを含むWPFツールチップを作成し、より詳細なテキストを含むテキストブロックを作成したいとします。私は、リソースディクショナリに次のスタイルを作成しました:カスタムWPFツールチップ

<Style x:Key="AppToolTip" 
    TargetType="ToolTip"> 
<Setter Property="OverridesDefaultStyle" Value="true" />  
<Setter Property="Template"> 
     <Setter.Value> 

      <ControlTemplate TargetType="ToolTip"> 
       <StackPanel> 
        <Label Content="{TemplateBinding Content}" FontWeight="Bold" Background="Blue" Foreground="White"> 

        </Label> 
        <TextBlock Padding="10" TextWrapping="WrapWithOverflow" Width="200"> 

        </TextBlock> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value></Setter> 
</Style> 

そして成功しそうのようなボタンにこのスタイルを適用すると、ツールチップヘッダを持つことができますが表示されます。

<Button.ToolTip> 
<ToolTip Style="{DynamicResource PalletToolTip}"> 
        <Binding Source="{x:Static ResStrings.New}"/> 
       </ToolTip> 
</Button.ToolTip> 
私が上こだわって何

上記の使用法から余分な記述テキストの内容を設定するにはどうすればよいですか?私はすでにツールチップのヘッダーを表示するときにContentプロパティにデータバインディングをしています。 Adam NathanのWPF Unleashedの本は、私が彼の例のツールチップXAMLを使用していることを認識しますが、彼のケースでは、ラベルとテキストブロックの内容にハードコードされた文字列を使用しています。より再利用可能なものを作成したいので、データバインディングを使用して同じ効果を得たいと思っています。

答えて

5

私はHeaderedToolTipクラスをToolTipから継承し、Headerプロパティを追加します。私はあなたがしたように、そのコントロールのテンプレートを指定します。内、これはあなたがツールヒント自体のルックアンドフィールをカスタマイズすることはできません

<Button> 
    <Button.ToolTip> 
     <HeaderedToolTip Header="{Binding ToolTipTitle}" Content="{Binding ToolTipText}"/> 
    </Button.ToolTip> 
</Button> 
+0

ありがとうKent - これは最高のアプローチのように思えます。 – Auburg

1

ツールチップに必要なすべてのプロパティを含むオブジェクトまたはViewModelを使用できます。

class MyToolTipViewModel : INotifyPropertyChanged 
{ 
    public string Header 
    { 
     get{ return mHeader;} 
     set{ mHeader = value; RaisePropertyChanged("Header"); } 
    } 

    public void RaisePropertyChanged(string aProperty) 
    { 
    // .. implementation of INotifyPropertyChanged 
    } 
} 

このクラスのインスタンスに直接通話料金を設定することができます。

myButton.ToolTip = new MyToolTipViewModel(); 

この後、ツールチップにはViewModelクラスの完全修飾名が表示されます。 今必要なのは、WPFにクラスをビジュアルオブジェクトに変換する方法を伝えるDataTemplateです。

<DataTemplate DataType="{x:Type MyToolTipViewModel}"> 
    <TextBlock Text="{Binding Header}"/> 
</DataTemplate> 

DataTemplateをリソースツリーに配置する必要があります。上位レベルのオブジェクトのリソースセクションまたはアプリケーションまたはウィンドウのリソースレベルに直接アクセスします。

希望に役立ちます。

+0

だけ内容:

<Button> <Button.ToolTip> <HeaderedToolTip Header="My Title" Content="My Content"/> </Button.ToolTip> </Button> 

あるいは、バインディングを持つ:それから私はそうのようにそれを使用することができるだろうそれ。 –

+0

コードを変更して、ツールヒントコントロールを目的のスタイルに設定し、ツールチップの内容をビューモデルに設定することができます。 – dowhilefor