是否可以在控件内显示所有可用的工具提示?
Is it possible to display all available tooltip inside a control?
对于 WPF 应用程序的文档,我需要激活所有可用工具提示的屏幕截图。
我尝试将应用程序的屏幕截图与在每张图片上激活的一个工具提示结合起来,但我不是 PS/Gimp 专家,而且要合并的图片很多。
基于 this answer,您可以遍历应用程序中类型 FrameworkElement
的所有子项以激活他们的工具提示(如果有)。
要激活工具提示,您可以使用 this answer。
最后你可以在你的应用程序中添加一个显示所有工具提示按钮,后面的代码将是这样的:
private void DisplayAllToolTips_OnClick(object sender, RoutedEventArgs e)
{
foreach (var element in FindVisualChildren<FrameworkElement>(this))
{
if (element.ToolTip == null)
continue;
var toolTip = element.ToolTip as ToolTip ??
new ToolTip {Content = element.ToolTip};
element.ToolTip = toolTip;
toolTip.PlacementTarget = element;
toolTip.Placement = PlacementMode.Relative;
toolTip.HorizontalOffset = 6;
toolTip.VerticalOffset = -6;
toolTip.Opacity = 0.8;
toolTip.IsOpen = true;
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null)
yield break;
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
if (child is T t)
yield return t;
foreach (var childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
对于 WPF 应用程序的文档,我需要激活所有可用工具提示的屏幕截图。
我尝试将应用程序的屏幕截图与在每张图片上激活的一个工具提示结合起来,但我不是 PS/Gimp 专家,而且要合并的图片很多。
基于 this answer,您可以遍历应用程序中类型 FrameworkElement
的所有子项以激活他们的工具提示(如果有)。
要激活工具提示,您可以使用 this answer。
最后你可以在你的应用程序中添加一个显示所有工具提示按钮,后面的代码将是这样的:
private void DisplayAllToolTips_OnClick(object sender, RoutedEventArgs e)
{
foreach (var element in FindVisualChildren<FrameworkElement>(this))
{
if (element.ToolTip == null)
continue;
var toolTip = element.ToolTip as ToolTip ??
new ToolTip {Content = element.ToolTip};
element.ToolTip = toolTip;
toolTip.PlacementTarget = element;
toolTip.Placement = PlacementMode.Relative;
toolTip.HorizontalOffset = 6;
toolTip.VerticalOffset = -6;
toolTip.Opacity = 0.8;
toolTip.IsOpen = true;
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null)
yield break;
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
if (child is T t)
yield return t;
foreach (var childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}