10

我可能遗漏了一些关于 WPF 设计基础的知识,但我想知道为什么 WPF 控件上的许多属性都暴露为“对象”类型?

例如,MenuItem.Icon 是一个对象,MenuItem.ToolTip 也是如此。作为一个几乎是第一次使用的用户,这让我非常困惑(感觉就像我在使用动态编程语言,不知道将 ToolTip 设置为 String 类型是否可行)。此外,我尝试将 Icon 设置为 'System.Drawing.Icon' 并得到“Argument 'picture' must be a picture that can be used as a Icon”的 ArgumentException。不应该键入属性,以便它至少可以描述你应该给它的世界吗?

老实说,我对原因的猜测是因为您无法在未创建的类型上实现接口(不创建包装器),但这只是猜测。

非常感谢您的回答和见解!

4

3 回答 3

2

我认为主要原因是因为Object是“.Net Framework 中所有类的最终基类”。这为您提供了灵活性,在 WPF 中您不限于预定义的类型。Wpf 是不同的,并且有一个学习曲线,但它确实为您提供了更多选择来创建看起来不错的产品。

IE

您可以将 TextBox 分配给 ToolTip:

TextBox tb = new TextBox();
tb.Text = "Hello World";
this.ToolTip = tb;

位图

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg")));
Image image = new Image();
image.Source = myBitmapImage;
this.ToolTip = image;

并将图像分配给 MenuItem

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg")));
Image image = new Image();
image.Source = myBitmapImage;
menuItem1.Icon = image;
于 2012-06-17T03:32:33.700 回答
1

考虑ToolTip例如。ToolTip 是一个ContentControl,它可以包含任何类型的 CLR(公共语言运行时)对象(例如字符串或 DateTime 对象)或UIElement对象(例如 Rectangle 或 Panel)。这使您可以向按钮和复选框等控件添加丰富的内容。

出于这个原因,诸如 的元素ToolTip被暴露为Object,这是类型层次结构的根(从而使代码易于使用、灵活和清晰)。

于 2012-06-17T10:16:22.893 回答
0

想象一下,这些属性被键入为UIElements(或其他一些 WPF 特定对象)。您将如何将对象添加到不是UIElements的控件?

您必须提供从 WPF 对象派生的包装器,以公开您需要的信息。大多数时候,包装器会简单地调用被包装对象的ToString()。鉴于您将使用的大多数类型都提供了足够好的ToString()的默认实现,因此只需调用它而不是让开发人员为所有内容编写包装器是有意义的。

其次,想象一下它们是否被键入为某个界面。如果您想传达此界面无法传达的内容怎么办?唯一的选择是 (a) 开发人员忍受框架的限制或 (b) 微软更新界面并破坏所有已经编写的现有代码。

还要考虑您是否使用像 MVVM 这样的模式。当前的设计意味着您的视图模型可以以任何方式公开与 WPF 无关的属性,这最终使您的代码在不同技术中更具可重用性。

最后,请记住,表示属性的对象与 WPF 呈现该信息的方式之间存在差异。例如,如果您使用诸如System.String之类的原始类型,WPF 将创建一个文本块并将 text 属性设置为ToString()的结果。这允许UI 显示的数据与 UI呈现信息的方式之间非常清晰的分离。

以一个表示菜单项的简单类为例,例如:

public class MenuItem
{
    public string Text { get; set; }
    public bool IsChecked { get; set; }
    public bool IsEnabled { get; set; }
}

此类型仅公开有关菜单项的数据,并且没有有关应如何呈现此信息的信息。实际上,除了类的名称 ( MenuItem ) 之外,这甚至不是特定于菜单项的,并且相同的数据可以在另一个 UI 控件中使用,例如选中的列表框,而无需进行任何更改。如果该类公开了 WPF 特定的用户界面元素,那么信息将需要由另一种类型来适应每个不同的用户界面控件。

于 2012-06-17T11:25:18.663 回答