【问题标题】:In WPF (or silverlight or WP7), should a picture wall derive from ItemsControl or Panel?在 WPF(或 silverlight 或 WP7)中,图片墙应该派生自 ItemsControl 还是 Panel?
【发布时间】:2011-06-09 13:09:04
【问题描述】:

假设我需要创建一个名为 PictureWall 的类,用于显示图片。

现在我发现 Panel 和 ItemsControl 都可以用来保存 Children 元素。那么 PictureWall 类应该派生自 Panel 吗?还是应该从 ItemsControl 派生。

注意:这不是一个真实的要求,这只是一个假设的问题。真正的问题是:什么时候应该创建 Control(或 ItemsControl)的子类,什么时候应该创建 Panel 的子类?

注意 2:这个想象中的图片墙控件不能仅在一个应用程序中使用。它可能被其他开发人员使用。如果它派生自 Panel 或 ItemsControl,它将向其他开发人员公开名为 Children 的属性。所以在这种情况下,从 Control 派生是一个更好的主意,对吧?

注 3:这个想象中的图片墙控件有自己的默认加载某些图片的方式(例如,从服务器拉取图片),它不希望这种方式被搞乱。如果是这样的话,那我们就不应该继承ItemsControl了吧?

【问题讨论】:

  • 您希望如何显示图片?看看silverlight.codeplex.com/releases/view/52297Wrappanel
  • 这不是一个真正的要求,它只是一个假设的问题。真正的问题是:什么时候应该创建 Control(或 ItemsControl)的子类,什么时候应该创建 Panel 的子类?

标签: wpf silverlight windows-phone-7 custom-controls


【解决方案1】:

Panel 是一个容器,用于排列其子项。例如:底部有一个标题和一个按钮,中间有一个图像的网格 - 网格非常灵活,可以帮助您在更改窗口大小等时移动和排列它们。

ItemsControl 是一个可帮助您处理项目集合的控件。让我们举一个具体的例子:Listbox。您可以非常轻松地显示项目列表、将模板应用到所有项目等等。

控件类基本上是一个 UI 元素,可以有自己的模板。

请注意,定义自己的 UserControl、编辑 PictureWall 的模板或样式、插入子类(有很多优点,例如您可以使用 Blend 重新定义样式)是一种更好的方式。

编辑:

@note2

如果我是你,我会制作自己的用户控件来重用现有控件来制作我想要的东西。如果这还不够,我会继承 Control。

[StyleTypedProperty(Property = "FooStyle", StyleTargetType = typeof(Control))]
public partial class MyDangControl: Control
{
 ...

@note3

将所有内容合二为一是个坏主意。您应该拆分从您的 Picture Wall 中获取数据的逻辑。例如,用户按下缩略图下载图像,整个 UI 挂起。糟糕的用户体验。

为了清楚起见,让我引用Pro WPF in C# 2010

控制

这是最常见的开始 构建控件时的要点 从头开始。它的基类 所有用户交互的小部件。这 控件类添加属性 设置背景和前景, 以及字体和对齐方式 内容。控制类还放置 本身进入跳格顺序(通过 IsTabStop 属性)并引入 双击的概念(通过 鼠标双击和 PreviewMouseDoubleClick 事件)。但 最重要的是,控制类 定义 Template 属性 允许其外观被交换 使用自定义元素树 无限的灵活性。

内容控制

这是控件的基类 可以显示单件 任意内容。那个内容可以 一个元素或自定义对象 与模板一起使用。 (内容是通过 内容属性,以及一个可选的 模板可以在 ContentTemplate 属性。)很多 控件包装特定的有限类型 内容(就像一个文本字符串 文本框)。因为这些控制 不支持所有元素,他们 不应被定义为内容 控制。

ItemsControl

ItemsControl 是 包装项目列表的控件,但 不支持选择,而 选择器是更专业的基础 支持的控件的类 选择。这些课程不经常 用于创建自定义控件, 因为数据模板功能 ListBox、ListView 和 TreeView 的 提供很大的灵活性。

面板

这是控件的基类 与布局逻辑。一个布局控件 可以容纳多个孩子并且 根据具体情况安排 布局语义。通常,面板 包括附加的属性,可以 设置在孩子身上配置 孩子们是怎么安排的。

【讨论】:

    【解决方案2】:

    它们都可以用来显示元素,但实际上 ItemsControl 提供了更多的功能。此外,ItemsControl 并没有真正显示它的元素,它利用 Panel 来做到这一点。

    ItemsControl 可以显示项目列表,这些项目可能是也可能不是 UIElements/Visuals。可以使用可配置的 DataTemplate 对项目进行模板化,最终确定项目的显示方式。此外,项目可以绑定到可观察的集合,因此它会自动更新。

    面板都不支持这些功能。可以使用 DataTemplates,但您必须手动创建关联的 ContentControl/ContentPresenter 并将其添加到您的面板中。

    最终,它们的功能是不同的。面板用于显示 UIElements/Visuals。 ItemsControl 用于显示任何类型的数据并根据需要应用模板。

    【讨论】:

    • 所以当我需要一种定制的方式来排列不同的元素时,我应该只创建一个 Panel 的子类,对吗?
    • @CuiPengFei - 不,这真的取决于您需要显示什么,而不是如何显示。自定义 ItemsControl 可以使用自定义 Panel 来布局它的子级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2012-10-21
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多