我正在编写一个简单的“教程”库,允许开发人员轻松地将分步教程添加到他们现有的 WPF 应用程序中。这些教程将通过添加突出显示控件并解释其用途的叠加层来帮助应用程序的首次用户找到自己的方式。最终结果将如下所示:
常规应用:
解释控件用途的叠加层:
我的问题是:将覆盖视图注入当前窗口的最可靠和最不显眼的方法是什么?到目前为止,我想出的最好的方法是要求开发人员将附加属性添加到将托管覆盖的任何窗口,然后在窗口的Initialized
回调中添加必要的元素:
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;
}
});
}
}
}
然而,这感觉像是一种 hack,而且我不确定这种方法是否会破坏应用程序的布局。此外,它要求窗口的Content
属性是 type 的实例UIElement
。
我想避免强迫开发人员更改他们的 XAML(即,向UserControl
每个窗口添加自定义覆盖)以使用我的库。将这种功能添加到现有 WPF 应用程序的最佳方法是什么?