现在学习XAML,我一直以Object.Attribute的格式看到XAML标签。例如:
<Deployment.OutOfBrowserSettings>
OutOfBrowserSettings ShortName="Hello World" >
不要回想起之前看过这样的XML属性,总是会看到简单的单词,或者可能是名称空间列前缀,例如x:application。因此,为了表达上面的对象/属性关系,我希望有一个符号,如:
<Deployment>
<OutOfBrowserSettings ShortName="Hello World" >
所以,我的问题是:'。'的意义是什么? XML标记内的表示法。什么是语义?它是否特定于XAML?
答案 0 :(得分:11)
要扩大一点Alex的说法:
对于XML,元素名称中的句点没有意义。 a
,a.
,a.b
和a.b.c
都是合法(且唯一)的元素名称。
要 XAML ,对元素名称中的句点具有相当大的意义。具有讽刺意味的是,Alex引用的建议,警告您不要在XML中使用句点字符,这正是为什么 XAML使用句点:以便XamlReader
可以告诉它何时{{1} } 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>
有两个原因。第一个是简单的XML设计:XML元素可以包含多个具有相同名称的元素。将属性建模为子元素实际上是个坏主意,因为那时你必须在模式中强制执行唯一性,或者当有多个具有相同名称的子元素时,有一个规则来处理对象的属性:
<ListBox>
<BorderThickness>2</BorderThickness>
...
这就是为什么XAML将属性建模为属性,XML要求是唯一的:
<ListBox>
<BorderThickness>2</BorderThickness>
<BorderThickness>3</BorderThickness>
<BorderThickness>4</BorderThickness>
...
(顺便说一句,在XAML中使用属性存在问题:如果必须按特定顺序设置对象的属性,则不应使用属性来表示它们。发生 <ListBox BorderThickness='2' BorderBrush='Yellow'...
按照它们在元素中出现的顺序读取属性,并按顺序将它们分配给属性。但读取和写入XML的工具不保证保留属性的顺序。这意味着那个提出this令人不安的问题的人可能会感到悲伤。)
其他的原因是,许多WPF对象是其他对象的容器。如果XAML允许元素表示属性,那么如果需要表示一个具有与其可能包含的对象类相同名称的属性的对象,则会被搞砸。例如,您当然可以创建一个具有XamlReader
属性的ItemsControl
,但如果您想在其Label
属性中存储Label
个对象,会发生什么?这种歧义不会出现在XAML中:
Items
答案 1 :(得分:2)
据我所知,XML中的“.
”没有特别的意义。换句话说,<a.b>
是与<a>
不同且不相关的标记。 XAML中的关系是仅由XAML解析器理解的语义。
另请注意,问题中的代码段不是XAML;它是Silverlight应用程序的部署清单的一部分。但是,再一次,清单解析器可以理解“.
”的语义,而不是XML解析器。
答案 2 :(得分:2)
今天在WPF in Action with Visual Studio 2008 by Feldman and Daymon
中找到了这个您可能已经注意到清单4.2中有关属性值的有趣信息。宽度和填充等属性看起来像常规XML属性。但是Left和Top属性的符号有点不同:
<Button Canvas.Left="40" Canvas.Top="40" >
按钮没有Left和Top的属性。与假定所有内容都具有显式位置的Windows窗体不同,WPF的工作假设是父级负责每个控件的放置。您将看到其他布局类型。在Canvas的情况下,每个控件都必须设置其显式位置。因为Canvas布局需要此信息,所以由Canvas布局来处理此信息。
在“经典”XML(即可以通过Schema验证的XML)中,您通常必须在每个子项周围引入一个元素,以指定特定于父项的属性,如列表4.3。
清单4.3。一种为子项设置属性的方法(但不支持WPF)
<Canvas>
<CanvasItem Left = "40" Top="40">
<Button>Button1</Button>
</CanvasItem>
</Canvas>
这种方法可行,但非常冗长,特别是当你有很多嵌套项目时。它还意味着一个实际上并不存在的层次结构。不需要更详细的XML并使Canvas遵循它可能不需要的结构,XAML引入了一种符号,通过使用点表示法允许在子项上定义属于父项的属性:
<Canvas>
<Button Canvas.Left="40" Canvas.Top="50">Button1</Button>
</Canvas>
这应该被理解为“当你将Button添加到画布时,告诉Canvas按钮应该位于Left 40和Top 40。”这些属性称为附加属性,因为它们附加到它们引用的子级,即使它们属于包含控件(在本例中为Canvas)。你会在整个XAML中看到各种属性的这种表示法。您只需要记住,中间带点的属性实际上是包含控件使用的设置值。好处是,当您在属性编辑器中编辑控件的属性时,附加属性将显示为控件属性集的一部分
答案 3 :(得分:0)
明确解释XML的命名规则,例如here:
XML元素必须遵循这些命名 规则:
- 名称可以包含字母,数字和其他字符
- 名称不能以数字或标点符号开头
- 名称不能以字母xml(或XML,或Xml等)
开头- 名称不能包含空格
可以使用任何名称,没有任何文字 保留
我提供的网址会继续提供“最佳做法”建议,其中包括
避免“。”字符。如果你的名字 一些“first.name”,一些软件 可能会认为“名字”是一个属性 对象“第一个。”
但是,这只是一个建议(打破它可能会使您的XML很难用于某些软件),就像使用-
的那个一样。在建议中,唯一真正关键的是避免在XML名称中使用:
(因为 与XML名称空间冲突! - 。)。
答案 4 :(得分:0)
简短的答案是,这纯粹是XAML构造,在XML中没有相关性。
对于XML,带有点的名称(如<ListBox.BorderThickness>
本身就是唯一的标记名,点是名称的一部分,就像您可以在其中包含带点的gmail ID一样。它没有特别的重要性或意义。
为什么XAML使用点?这只是XAML格式,这意味着我们正在设置元素对象的所述属性。这本质上是供XAML引擎处理的,并且还使XAML可读且易于理解。
其他信息:很高兴。
XAML本质上包含成对的属性及其值,并且由于它们表示相当复杂的对象(导致更深的层次结构),因此它有助于确定哪个元素是属性,哪个元素是值。
无论何时使用XAML编译器或看到
值得注意的是,XAML不允许您只为值插入任何XML代码,这些值始终包裹在相关的XAML对象中,这就是它知道如何处理该值的方式。
例如:
<ComboBox>
<ComboBoxItem>
Item One
</ComboBoxItem>
<ComboBoxItem>
Item Two
</ComboBoxItem>
</ComboBox>
从概念上很容易看到上面的内容,但是当然,下面是常见且推荐的语法,它很简短并且很容易看到:
<ComboBox>
<ComboBoxItem Content="Item One"/>
<ComboBoxItem Content="Item Two"/>
</ComboBox>
在简单的情况下,这可能没有太大意义,但是可以想象您的组合框项目是一个复杂的项目(假设名为House
的C#类是两个属性Bedrooms
和Baths
) 。然后ComboBoxItem将如下所示:
<ComboBoxItem>
<local:House Bedrooms="3" Baths="2"/>
</ComboBoxItem>
因此,既然自从ComboBoxItem以来,您就可以选择它并进行其他操作,而您可能会对组合框中的某项进行任何操作。因为您具有<ComboBoxItem>
标记,所以您可以在其中包含任何复杂的结构(例如使用面板),并且XAML引擎将知道所有这一项。也许也可以找出没有该标签的情况,但可以想象一个人阅读和理解该代码有多困难。
这也是为什么在提供Style
时将样式包装在顶部Style
对象中的原因,如下所示:
<Label Content="My Label">
<Label.Height> 30</Label.Height>
<Label.Style>
<Style TargetType="Label">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
这也是为什么XAML中通常会有更深层次的结构,一件事进入另一件事,另一件事,再到另一件事:)