我想创建一个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,但在他的情况下,他使用硬编码字符串作为标签和文本块的内容。我想创建一些更可重用的东西,因此希望使用数据绑定来实现相同的效果。
答案 0 :(得分:6)
我会从HeaderedToolTip
继承ToolTip
类并添加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>
答案 1 :(得分:2)
您可以使用包含工具提示中所需的所有必需属性的对象或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需要放在资源树中。在更高级别对象的资源部分或直接在应用程序或窗口资源级别。
希望有所帮助。