我需要能够在运行时在 3 层 WPF 应用程序中编辑工具提示。(这可能会允许管理员,而不是每个用户。)我想要的是在数据库中有工具提示,我一直在寻找各种技术来实现这一点。Josh Smith 有一个使用工具提示转换器的好例子(这里)。但是,我需要将工具提示链接到各个 UI 控件,因此每个控件都必须具有唯一标识符。不幸的是,这不是 WPF 所要求的。我不想给每个控件一个名字。我记得您可以以某种方式生成 x:Uid,但不记得如何生成。另外,我想以某种方式连接到工具提示机制,而不是为每个控件定义一个转换器。我意识到我的目标可能有点高,但是有什么想法吗?
问问题
308 次
1 回答
1
您可以使用VisualTreeHelper
类(msdn)。
在此解决方案中,如果要从 db 设置 ToolTip,则必须设置元素的名称。
首先,您必须创建将保存来自 db 的数据的类:
class ToolTipContainer
{
public string ElementName { get; set; }
public string ToolTip { get; set; }
}
接下来,您应该使用它VisualTreeHelper
来遍历所有元素:
class ToolTipManager
{
List<ToolTipContainer> source;
public ToolTipManager(List<ToolTipContainer> source)
{
this.source = source;
}
public void EnumVisual(Visual myVisual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
((dynamic)childVisual).ToolTip = source.Where(x => x.ElementName == childVisual.GetValue(Control.NameProperty) as string).Select(x => x.ToolTip).FirstOrDefault();
EnumVisual(childVisual);
}
}
}
使用示例:
<Window x:Class="WPFToolTipDB.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">
<Grid>
<StackPanel>
<Button Name="Button" Content="Click me" />
<TextBox MinWidth="150" />
<Button Name="Button1" Content="Click me!" />
<TextBlock Name="TextBlock" Text="My text block" />
<StackPanel Orientation="Horizontal">
<TextBlock Name="tbName" Text="Name:" />
<TextBox Name="tbEnterName" MinWidth="150" />
</StackPanel>
</StackPanel>
</Grid>
</Window>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// When you don't specify name of the element you can set default ToolTip.
source.Add(new ToolTipContainer { ElementName = string.Empty, ToolTip = "Empty ToolTip!!!" });
source.Add(new ToolTipContainer { ElementName = "Button", ToolTip = "Click me" });
source.Add(new ToolTipContainer { ElementName = "Button1", ToolTip = "Click me!" });
source.Add(new ToolTipContainer { ElementName = "TextBlock", ToolTip = "My TextBlock" });
source.Add(new ToolTipContainer { ElementName = "tbName", ToolTip = "Enter your name!" });
source.Add(new ToolTipContainer { ElementName = "tbEnterName", ToolTip = "Please enter your name here!" });
var ttManager = new ToolTipManager(source);
ttManager.EnumVisual(this.Content as Visual);
}
List<ToolTipContainer> source = new List<ToolTipContainer>();
}
于 2013-03-11T17:28:15.667 回答