Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时向窗口添加覆盖_C#_Wpf_User Interface_Overlay - Fatal编程技术网

C# 在运行时向窗口添加覆盖

C# 在运行时向窗口添加覆盖,c#,wpf,user-interface,overlay,C#,Wpf,User Interface,Overlay,我正在编写一个简单的“教程”库,它允许开发人员轻松地将逐步教程添加到现有的WPF应用程序中。这些教程将通过添加一个突出显示控件并解释其用途的覆盖图,帮助首次使用该应用程序的用户找到解决方法。最终结果如下所示: 常规应用程序: 说明控件用途的覆盖图: 我的问题是:将覆盖视图注入当前窗口的最可靠、最不引人注目的方式是什么?到目前为止,我想到的最好的方法是要求开发人员将附加属性添加到托管覆盖的任何窗口中,然后在窗口的初始化回调上添加必要的元素: public static void IsTutor

我正在编写一个简单的“教程”库,它允许开发人员轻松地将逐步教程添加到现有的WPF应用程序中。这些教程将通过添加一个突出显示控件并解释其用途的覆盖图,帮助首次使用该应用程序的用户找到解决方法。最终结果如下所示:

常规应用程序:

说明控件用途的覆盖图:

我的问题是:将覆盖视图注入当前窗口的最可靠、最不引人注目的方式是什么?到目前为止,我想到的最好的方法是要求开发人员将附加属性添加到托管覆盖的任何窗口中,然后在窗口的
初始化
回调上添加必要的元素:

public static void IsTutorialOverlayCompatibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((Boolean)e.NewValue == true)
        {
            if (sender as Window != null)
            {
                Window window = (Window)sender;
                window.Loaded += new RoutedEventHandler((o, eargs) =>
                    {
                        Grid newRootElement = new Grid();
                        newRootElement.Name = "HelpOverlayRoot";
                        if (window.Content as UIElement != null)
                        {
                            UIElement currentContent = (UIElement)window.Content;
                            window.Content = null;
                            newRootElement.Children.Add(currentContent);
                            newRootElement.Children.Add(new HelpOverlayControl());
                            window.Content = newRootElement;
                        }
                    });
            }
        }
    }
然而,这感觉像是一种黑客行为,我不确定这种方法是否会破坏应用程序的布局。此外,它要求窗口的
Content
属性是类型
UIElement
的实例


我希望避免为了使用我的库而强迫开发人员更改他们的XAML(即,向每个窗口添加自定义覆盖
UserControl
)。向现有WPF应用程序添加此类功能的最佳方法是什么?

您可以尝试访问窗口的
AdornerLayer
,这将允许您在任何地方绘制任何内容。您好,我正在尝试实现类似的功能。你有没有尝试过类似的方法?没有在XAML中注入视图。