我可能遗漏了一些关于WPF设计基础的东西,但我想知道为什么WPF控件上的许多属性都被公开为'Object'类型?
例如,MenuItem.Icon是一个Object,MenuItem.ToolTip也是。作为一个近乎第一次使用的用户,这对我来说非常混乱(我觉得我使用的是动态编程语言,不知道将ToolTip设置为String类型是否会起作用)。此外,我试图将Icon设置为'System.Drawing.Icon',并且我得到ArgumentException“Argument'图片'必须是可以用作Icon的图片。”不应该输入属性,这样至少可以描述你应该给它的世界吗?
老实说,我猜的原因是因为你无法在你没有创建的类型上实现接口(没有创建包装器),但这只是猜测。
非常感谢您的回答和见解!
答案 0 :(得分:2)
我认为主要原因是Object是“.Net框架中所有类的最终基类”。这为您提供了灵活性,在WPF中,您不仅限于预定义类型。 Wpf是不同的,并且有一个学习曲线,但它确实为您提供了更多选项来创建一个看起来不错的产品。
即
您可以将TextBox分配给工具提示:
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;
答案 1 :(得分:1)
例如考虑ToolTip
。 ToolTip是ContentControl,可以包含任何类型的CLR(公共语言运行时)对象(例如字符串或DateTime对象)或UIElement
对象(例如作为矩形或面板)。这使您可以向Button和CheckBox等控件添加丰富的内容。
出于这个原因,ToolTip
之类的元素被公开为Object
,这是类型层次结构的根源(具有易用性,代码的灵活性和清晰度)。
答案 2 :(得分:0)
想象一下,这些属性被输入为 UIElements (或其他一些WPF特定对象)。如何将对象添加到不是 UIElements 的控件?
您必须提供从WPF对象派生的包装器,该包装器公开您需要的信息。大多数情况下,包装器只会调用被包装对象的 ToString()。看到你将使用的大多数类型提供了足够好的 ToString()的默认实现,只需调用它而不是让开发人员为所有内容编写包装器是有意义的。
其次,想象一下它们是否被键入某个界面。如果你想传达这个界面不能的东西怎么办?唯一的选择是(a)开发人员生活在框架的限制之下或(b)Microsoft更新界面并破坏已经编写的所有现有代码。
还要考虑你是否使用像MVVM这样的模式。当前的设计意味着您的视图模型可以以任何方式公开与WPF无关的属性,最终使您的代码在不同技术中更具可重用性。
最后,请记住,表示属性的对象与WPF呈现该信息的方式之间存在差异。例如。如果使用基本类型,例如 System.String ,WPF将创建一个文本块并将text属性设置为 ToString()的结果。这样,用户界面显示的数据与UI显示信息呈现的方式非常清晰。
使用表示菜单项的简单类,例如:
public class MenuItem
{
public string Text { get; set; }
public bool IsChecked { get; set; }
public bool IsEnabled { get; set; }
}
此类型仅公开有关菜单项的数据,并且没有关于如何呈现此信息的信息。实际上,除了类的名称( MenuItem )之外,这甚至不是特定于菜单项的,并且相同的数据可以在另一个UI控件中使用,例如检查列表框而不需要更改。如果类暴露了WPF特定的用户界面元素,那么每个不同的用户界面控件都需要根据其他类型调整信息。