如何知道 XAML 设计器中的活动控件?

How to know active control within XAML designer?

在设计时,如何知道用户在自定义项控件中激活/聚焦哪个控件,以便显示该选定项的呈现?

我正在寻找类似于 TabControl:

的功能

我的控件的不同之处在于它显示了一个非常简单的顺序工作流,并且会显示面包屑导航而不是选项卡。目前,我只是显示控件的第一个面板内容。我需要知道开发人员何时在 XAML 编辑器中激活另一个面板以相应地显示该面板的内容。

我目前正在寻找 MeasureOverride 中可用的值,但只要我在代码隐藏中有任何可用的值,我就会很灵活。

我试过

这样的技巧
if (System.ComponentModel.DesignerProperties.IsInDesignTool)
{
    foreach (var panel in this.Panels)
    {
        panel.GotFocus += focusHandler;
    }
}

并使用 System.Windows.Input.FocusManager.GetFocusedElement() 但到目前为止还没有遇到任何运气。

有两种可能的方法可以解决这个问题:

困难的方法(Visual Studio设计师支持)

最好的办法是查看 WPF Designer Extensibility documenation,并了解如何实现 DesignTime 对 TabControl 的支持。

在设计时,Designer 有一些机制可以防止用户直接与控件交互。这就是为什么您很难确定哪个元素具有焦点。

您可以教设计器如何为您的控件提供自定义装饰器,以便用户可以通过装饰器与它们交互。

供您参考,可在以下位置找到 TabControl 扩展模块:

C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Libraries\Client\Design
- System.Windows.Controls.Design.dll
- System.Windows.Controls.VisualStudio.Design.dll
- System.Windows.Controls.Expression.Design.dll

关键思想似乎是:

  1. SelectedTabItemPolicy 列出可以出现选择的控件类型(在本例中为 TabItem
  2. TabItemAdornerProvider 然后在选定的 TabItem
  3. 上调用 SetDesignTimeIsSelected
  4. 这又会调用:

    item.get_Context().get_Services().Publish(服务);

这似乎采用了值字典。这里有很多兔子洞可以探索。

更简单的出路

您实际上可以响应 属性 sheet 中的变化。例如当 SelectedIndex 发生变化时,您可以使不同的页面可见。

更新日志 更新了指向 WPF 设计器文档的链接。