2011-07-05 101 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

我会从ToolTip继承HeaderedToolTip类,并添加一个Header属性。我会像您所做的那样为该控件指定模板。然后,我将能够使用它像这样:

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

或者,用绑定:

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

感谢肯特 - 我认为这看起来是最好的方法。 – 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 
    } 
} 

那么你可以直接在这个类的实例上设置tolltip。

myButton.ToolTip = new MyToolTipViewModel(); 

现在,在此之后,您的工具提示只会显示ViewModel类的完整限定名称。 您现在需要的是一个DataTemplate,它告诉WPF如何将该类转换为可视对象。

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

DataTemplate需要放置在资源树中。在较高级别对象的资源部分中或直接在应用程序或窗口资源级别上。

希望有所帮助。

+0

这不会允许您自定义工具提示本身,只有在内容的外观和感觉它。 –

+0

您可以更改我的代码以设置所需样式的工具提示控件,然后将工具提示的内容设置为视图模型。 – dowhilefor