现在学习XAML,我一直看到Object.Attribute格式的XAML标签.例如:
<Deployment.OutOfBrowserSettings>
OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)
不要记得以前看过这样的XML属性,总是会看到简单的单词,或者可能是名称空间列前缀,例如x:application.因此,为了表达上面的对象/属性关系,我希望有一个符号,如:
<Deployment>
<OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:'.'的意义是什么?XML标记内的表示法.什么是语义?它是否特定于XAML?
Rob*_*ney 11
为了扩大一点Alex的说法:
对于XML,元素名称中的句点没有意义. a,a.,a.b,和a.b.c都是合法的(也是唯一的)元素名称.
对于XAML,元素名称中的句点具有相当大的意义.讽刺的是,亚历克斯报价,从你的XML使用期字符警告你离开的建议,也正是为什么 XAML使用时期:使XamlReader所知道的,它看到的时候first.name,那name是对象的属性first.因此:
<ListBox>
<ListBox.BorderThickness>2</ListBox.BorderThickness>
<ListBox.BorderBrush>Yellow</ListBox.BorderBrush>
<TextBox>foo</TextBox>
<TextBox>bar</TextBox>
<TextBox>baz</TextBox>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
为什么你不能这样做?
<ListBox>
<BorderThickness>2</BorderThickness>
...
Run Code Online (Sandbox Code Playgroud)
有两个原因.第一个是简单的XML设计:XML元素可以包含多个具有相同名称的元素.将属性建模为子元素实际上是一个坏主意,因为那时你必须在模式中强制执行唯一性,或者当有多个具有相同名称的子元素时,有一个规则来处理对象的属性:
<ListBox>
<BorderThickness>2</BorderThickness>
<BorderThickness>3</BorderThickness>
<BorderThickness>4</BorderThickness>
...
Run Code Online (Sandbox Code Playgroud)
这就是为什么XAML将属性建模为属性,XML要求是唯一的:
<ListBox BorderThickness='2' BorderBrush='Yellow'...
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,有一个与在XAML使用属性的问题:如果一个对象的属性必须按照特定的顺序来设置,你不应该使用属性来表示它们它发生的XamlReader顺序读取的属性,他们出现在元素中,并按顺序将它们分配给属性.但是读取和写入XML的工具不能保证保留属性的顺序.这意味着提出这个令人不安的问题的人可能会感到悲伤.)
在另一个原因是,这么多的WPF对象是其他对象的容器.如果XAML允许元素表示属性,那么如果需要表示具有与其可能包含的对象的类同名的属性的对象,则会被搞砸.例如,你当然可以创建一个ItemsControl具有Label属性的东西,但是如果你想Label在其Items属性中存储对象会发生什么?XAML中不会出现这种歧义:
<MyItemsControl>
<MyItemsControl.Label>this is a property of MyItemsControl</MyItemsControl.Label>
<Label>this is an item that MyItemsControl contains</Label>
</MyItemsControl>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8108 次 |
| 最近记录: |