【问题标题】:wpf Transparent window / layer with hotspots dependent on controls in child windowwpf 透明窗口/层,其热点依赖于子窗口中的控件
【发布时间】:2014-09-18 14:56:18
【问题描述】:

我正在开发一个 WPF 应用程序,并希望创建一个上下文相关的帮助系统。我希望帮助内容位于包含当前窗口名称、控件和与该控件相关的帮助的 xml 文件中。然后,此帮助屏幕将以透明的外观打开并从 xml 文件中读取,然后将帮助图标放在此透明窗口上,靠近它所覆盖的屏幕中的控件,然后单击帮助图标时会显示一些帮助在工具提示或基础控件的类似内容中。

关于创建透明窗口并让该窗口能够在它所覆盖的窗口中找到某些控件的位置的任何建议?

感谢您的任何意见或想法

【问题讨论】:

  • 您是否查看过 WPF 的 Adorner 支持?将图标放置在 AdornerLayer 中可能比单独的窗口更幸运,而且放置它们肯定更容易。

标签: c# wpf transparent layer


【解决方案1】:

不出所料,您可以通过将控件的Background 属性设置为Transparent 来使控件透明。您可以使用任何控件来显示您的帮助详细信息,只要它在 XAML 的底部声明,它就会出现在其他控件的顶部。您可能更愿意显式设置 Panel.ZIndex 属性以增加其“Z”顺序。

至于定位这个控件,我假设位置将与鼠标指针的位置有关。在这种情况下,您可以这样做:

HitTestResult hitTestResult = 
    VisualTreeHelper.HitTest(adornedUIElement, e.GetPosition(adornedUIElement));
Control controlUnderMouse = hitTestResult.VisualHit.GetParentOfType<Control>();

...

public static T GetParentOfType<T>(this DependencyObject element) where T : DependencyObject
{
    Type type = typeof(T);
    if (element == null) return null;
    DependencyObject parent = VisualTreeHelper.GetParent(element);
    if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) parent = ((FrameworkElement)element).Parent;
    if (parent == null) return null;
    else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) return parent as T;
    return GetParentOfType<T>(parent);
}

这个GetParentOfType 方法是一个Extension method,应该添加到static 类中。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2010-10-07
    • 2018-09-25
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多