xaml - 如何了解 XAML 设计器中的事件控件?

标签 xaml silverlight design-time

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

我正在寻找类似于 TabControl 的功能:

enter image description here

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

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

我试过这样的技巧

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

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

最佳答案

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

困难的方法(Visual Studio Designer 支持)

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

在设计时,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 上调用 SetDesignTimeIsSelected
  3. 这又会调用:

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

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

更简单的出路

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

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

关于xaml - 如何了解 XAML 设计器中的事件控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217502/

相关文章:

c# - 如何在 WPF 中按名称查找样式触发器嵌入元素?

silverlight - 不在主线程中运行时,Silverlight 中的 HTTP 速度很慢

java - JDialog 不会显示在设计选项卡中

silverlight - ssl、silverlight、wcf 和本地安装

delphi - RTTI 可以在设计时询问项目代码中的类型吗?

wpf - 在 Blend 设计时使用 Moq

c# - 使用PK从列表中获取图像并显示为MVVM中ListBox中另一个对象的一部分

xaml - 使用 Visual Studio Intellisense 编辑独立 XAML

c# - 将切换按钮绑定(bind)到两个命令

c# - 测试依赖 MEF 注入(inject)的非导出类