我想创建一个包含自定义内容的工具提示。因为我想保留ToolTip类的默认行为和样式,所以我不想定义其模板,而是为其分配自定义内容。我决定创建一个具有特定依赖项属性的ToolTip类后代,这些属性将从自定义内容中引用。这是一个例子:
Public Class CustomToolTip
Inherits ToolTip
Public Shared Property Value1Property As DependencyProperty = DependencyProperty.Register("Value1", GetType(String), GetType(CustomToolTip), New PropertyMetadata(""))
Public Property Value1 As String
Get
Return GetValue(Value1Property)
End Get
Set(value As String)
SetValue(Value1Property, value)
End Set
End Property
End Class
我在单独的资源字典文件中定义了内容,如下所示:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<Style x:Key="ToolTipContent" TargetType="local:CustomToolTip">
<Setter Property="Content">
<Setter.Value>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=local:CustomToolTip}, Path=Value1}" />
</StackPanel>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
资源字典文件是从使用CustomToolTip类的控件引用的,例如:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication1">
<Window.Resources>
<ResourceDictionary x:Name="resourceDict">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="CustomToolTip.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Canvas>
<Button x:Name="myButton" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75">
<Button.ToolTip>
<local:CustomToolTip Value1="Test" Style="{DynamicResource ToolTipContent}" />
</Button.ToolTip>
</Button>
</Canvas>
</Window>
这很好用,但直到我重新加载控件的资源字典。我在我的生产应用程序中这样做,因为它使用用户可以在运行时更改的自定义主题。我重新加载这样的字典(我使用合并的字典,因为在我的生产应用资源中存储了几个文件):
resourceDict.Clear()
Dim src As New Uri("C:\Users\romico\AppData\Local\Temporary Projects\WpfApplication1\Themes\CustomToolTip.xaml", UriKind.RelativeOrAbsolute)
Dim dict As New ResourceDictionary() With {.Source = src}
resourceDict.MergedDictionaries.Add(dict)
重新加载字典时,工具提示不再显示任何内容。似乎对Value1的绑定由于某种原因停止工作。
让我提一下,在运行时加载的资源文件与上面的资源文件不同,后者属于项目。外部人员声明“本地人”。名称空间包括程序集名称:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1;assembly=WpfApplication1">
如果你帮我解决问题,我将不胜感激。谢谢!
答案 0 :(得分:0)
我定义了ContentTemplate而不是Content,这解决了这个问题。但是我不明白为什么(我是WPF的初学者)。如果有人能够解释为什么这与上述第一种方法相反,我将不胜感激。谢谢!
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<Style x:Key="ToolTipContent" TargetType="local:CustomToolTip">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=local:CustomToolTip}, Path=Value1}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>