【问题标题】:"Popup is a control part" - what is a 'control part' in Silverlight?“弹出窗口是控制部分”- Silverlight 中的“控制部分”是什么?
【发布时间】:2011-10-23 22:54:04
【问题描述】:

我正在尝试使用 Expression Blend 在 Silverlight 中设置 ComboBox 的样式。

ComboBox 模板包含四个项目:

  • ContentPresenterBorder
  • DisabledVisualElement
  • FocusVisualElement
  • Popup

ContentPresenterBorderPopup 都包含子元素,并且还有一个小图标,看起来像带有绿色勾号的拼图。将鼠标悬停在此图标上时,我得到了工具提示:

Popup 是一个控制部分。

这是什么意思?

【问题讨论】:

    标签: silverlight expression-blend


    【解决方案1】:

    这个blog post 解释了部分,但实际上它是一个具有预定义类型和名称的元素。假设我想创建一个名为FancyControl 的新控件。在我的控件中,我想要两个滑块,无论出于何种原因,对我来说进行控件的最佳方式是直接访问在我的代码隐藏中为我的控件创建的 Slider 对象。

    我可以给它们任何旧名称(即“左”和“右”),然后使用GetTemplatedChildFancyControl.OnApplyTemplate 中查找实例。使用任意名称的问题在于,如果其他人想要重新设置我的控件样式,他们不知道 Sliders 需要 拥有“左”和“右”名称以使我的控件正常工作。

    Microsoft 使用了以PART_ 为前缀的元素名称的约定。所以现在当有人重新设计我的控件时,他们会立即知道Slider 必须具有相同的名称(即“PART_Left”和“PART_Right”),否则他们可能会失去功能。

    TemplatePartAttribute 可用于指示有效部件名称及其关联类型。 Blend 等设计人员可以使用它来正确检测命名部件。

    还值得一提的是,控件的设计方式应该是,如果缺少命名部分,那么它应该继续使用较少的功能(即它不应该抛出异常)。

    【讨论】:

    • 很棒的答案——这也解释了为什么我看到这么多以PART_为前缀的控件。
    • 话虽如此,似乎无论出于何种原因,组合框内的“部分”都需要命名为PopupDropDownToggle,以便组合框正常工作。
    • 是的,因为在 ComboBox 类中它使用 GetTemplateChild(string controlname) 来获取这些控件。 ;)
    • @KirkBroadhurst - 你是对的。看起来 Silverlight 可能没有遵循“PART_”约定,至少并非总是如此。如果您查看反射器中的 ComboBox,您可以看到 TemplatePartAttribute 定义为:[TemplatePart(Name="ContentPresenterBorder", Type=typeof(FrameworkElement)), TemplatePart(Name="ContentPresenter", Type=typeof(ContentPresenter)), TemplatePart(Name="Popup", Type=typeof(Popup)), TemplatePart(Name="DropDownToggle", Type=typeof(ToggleButton)), TemplatePart(Name="ScrollViewer", Type=typeof(ScrollViewer))]
    • 平心而论,找到控件名称最简单的方法是使用表达式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多