【问题标题】:Should I inherit from a stackpanel instead of a stack panel, grid or other UI element or UserControl?我应该从堆栈面板而不是堆栈面板、网格或其他 UI 元素或 UserControl 继承吗?
【发布时间】:2010-03-28 02:29:26
【问题描述】:

所以我正在构建一个 UI,它可能会出现在对话窗口中,也可能嵌入到更大页面的一部分中。

我对 WPF 没有太多经验,但在 ASP.NET 中,您总是使用 UserControls,因为它们并不是真正通用的 UI 继承继承自(在某种程度上,UserControl 只是一个 div)。

我的同事编写了很多直接从 stackpanel 继承的控件。这似乎是一种体面的做事方式。但是当我为要编写的代码创建一个控件时,我看到了一个只包含 UserControl 的对话框,在 WPF 的上下文中我并不熟悉。

那么有人可以向我解释一下构建从用户控件继承的控件与直接从 stackPanel 继承的区别吗?

【问题讨论】:

    标签: .net wpf xaml user-controls


    【解决方案1】:

    在 WPF 中有很多不同级别的实现控件。根据《WPF in Action》一书,可以使用三种方法:

    1. 用户控件。这类似于 ASP.NET 用户控件。您将使用其他控件的组合来构建控件。
    2. 自定义控件。这是为了在不同的项目中提供更多可密封和可重复使用的组件。
    3. 框架元素。这是更底层的东西。

    从 Stackpanel 实现听起来类似于自定义控件方法。这实际上取决于在这三种方法中进行选择时需要什么级别的控制、复杂性和可重用性。以我个人的经验来看:

    用户控件更容易制作,但很难重用,也不容易为其应用主题。 (您知道 WPF 允许相同的控件有不同的呈现方式 - 进一步阅读:WPF 中的模板);自定义控件(您也可以从控件、面板、网格和其他控件继承)提供重用、重新主题等功能。

    回到你的问题。答案是,取决于你需要什么。如果你只是想要类似于 asp.net 中的 usercontrol 的东西,那么 wpf 中的 usercontrol。我不会从 stackpanel 或 grid 继承,除非我需要 stackpanel 或 grid 的替代品,让设计者担心布局。

    【讨论】:

    • 自定义控件不直接与可重用性有关 - 自定义控件与模板有关,即控件的使用者能够改变其视觉外观。我想这会提高可重用性,因为这意味着只要行为保持适当,消费者就可以将控件用于更广泛的显示工作,但我认为这是一种特定形式的可重用性,我认为值得确定。 (在某种程度上,这意味着自定义控件较少“可密封”,因为它们必须应对用户对它们施加任意视觉树!)
    【解决方案2】:

    仅当您尝试在 StackPanel 上编写变体时,从 StackPanel 继承才是一个好主意。

    WPF 编程很像 HTML 页面设计 - 您可以使用语义结构并通过单独的样式处理外观,或者您可以将逻辑和样式交织在一起。

    您的自定义控件有责任提供一些行为和数据,可能只是通过绑定数据。根据这些工作量,它可能只是一个类标识符和一个默认模板。

    WPF 中最重要的想法之一是使用控件和数据模板更改外观可以完成多少工作。

    我建议学习 this tutorial 和 Christian Moser 的 article 中的图表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多