代码之家  ›  专栏  ›  技术社区  ›  zar

XAML的属性元素语法在XML中有什么意义吗?

  •  0
  • zar  · 技术社区  · 5 年前

    现在学习XAML,我一直在format对象中看到XAML标记。属性例如:

     <Deployment.OutOfBrowserSettings>
         OutOfBrowserSettings ShortName="Hello World" >
    

    不记得以前见过这样的XML属性,总是会看到简单的单词,或者可能是名称空间列前缀,比如x:application。因此,要表达如上所述的对象/属性关系,我希望使用如下符号:

    <Deployment>
       <OutOfBrowserSettings ShortName="Hello World" >
    

    所以,我的问题是:“.”的意义是什么XML标记中的符号。语义是什么?它是针对XAML的吗?

    0 回复  |  直到 16 年前
        1
  •  15
  •   Community Mohan Dere    8 年前

    让我们来详细介绍一下Alex所说的:

    对于XML来说,元素名称中的句号没有任何意义。 a , a. , a.b a.b.c 都是合法(且唯一)的元素名称。

    XAML ,有 相当大的 元素名称中某个句点的重要性。具有讽刺意味的是,Alex引用的建议警告您不要在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>
    

    你为什么不能这么做?

    <ListBox>
       <BorderThickness>2</BorderThickness>
       ...
    

    有两个原因。第一个是简单的XML设计:XML元素可以包含多个同名元素。将属性建模为子元素实际上是一个坏主意,因为这样一来,您就必须在模式中强制实现唯一性,或者当存在多个同名子元素时,必须有一个处理对象属性的规则:

    <ListBox>
       <BorderThickness>2</BorderThickness>
       <BorderThickness>3</BorderThickness>
       <BorderThickness>4</BorderThickness>
       ...
    

    这就是为什么XAML将属性建模为 属性 ,其中XML要求是唯一的:

    <ListBox BorderThickness='2' BorderBrush='Yellow'...
    

    (顺便说一句,在XAML中使用属性有一个问题:如果一个对象的属性必须按特定的顺序设置,你不应该使用属性来表示它们 发生 XamlReader 按属性在元素中出现的顺序读取属性,并按该顺序将其指定给属性。但是读写XML的工具不能保证保留属性的顺序。也就是说问这个人 this (这个令人不安的问题可能会让人伤心。)

    这个 另外 原因是如此多的WPF对象都是其他对象的容器。如果XAML允许元素表示属性,那么如果需要表示一个对象,而该对象的属性与其可能包含的对象的类同名,那么您就要倒霉了。例如,您当然可以创建一个 ItemsControl 那有一个 Label 但如果你想储存 标签 对象在其 Items 所有物这种模糊性在XAML中不会出现:

    <MyItemsControl>
       <MyItemsControl.Label>this is a property of MyItemsControl</MyItemsControl.Label>
       <Label>this is an item that MyItemsControl contains</Label>
    </MyItemsControl>
    
        2
  •  2
  •   Franci Penov    16 年前

    据我所知,这对 . “在XML中。换句话说, <a.b> 是一个与 <a> .XAML中的关系是仅由XAML解析器理解的语义。

    另一方面,你问题中的片段不是XAML;它是Silverlight应用程序部署清单的一部分。不过,这句话的语义 . '由清单解析器而不是XML解析器理解。

        3
  •  2
  •   Avi    16 年前

    这是今天在 WPF in Action with Visual Studio 2008 by Feldman and Daymon

    4.2.3. 使用附加属性

    您可能已经注意到清单4.2中的属性值有一个有趣的地方。宽度和填充等属性看起来像常规的XML属性。但左属性和上属性的符号有点不同:

    <Button Canvas.Left="40" Canvas.Top="40" >
    

    按钮没有“左”和“上”属性。与Windows窗体不同,Windows窗体假定所有控件都有一个明确的位置,WPF的工作假设是父控件负责每个控件的放置。您将在其他布局类型中看到这一点。对于画布,每个控件都必须设置其显式位置。因为画布布局需要这些信息,所以由画布布局来处理这些信息。

    在“经典”XML(即可以通过模式验证的XML)中,通常需要在每个子级周围引入一个元素,以指定特定于父级的属性,如清单4.3所示。

    清单4.3。为子级设置属性的方法(但WPF不支持)

    <Canvas>
        <CanvasItem Left = "40" Top="40">
            <Button>Button1</Button>
        </CanvasItem>
    </Canvas>
    

    这种方法可以工作,但非常冗长,尤其是当您有很多嵌套项时。它还意味着一种并不存在的等级制度。XAML不需要更详细的XML,也不需要让画布遵循它可能不需要的结构,而是引入了一种表示法,允许通过使用点表示法在子对象上定义属于父对象的属性:

    <Canvas>
      <Button Canvas.Left="40" Canvas.Top="50">Button1</Button>
    </Canvas>
    

    这应该理解为“当你把按钮添加到画布上时,告诉画布按钮应该位于左40和上40。”这些属性称为附加属性,因为它们附加到它们所引用的子级,即使它们属于包含控件(本例中为画布)。您将在XAML中看到各种属性的这种符号。您只需记住中间点的属性是由包含控件使用的真正设置值。好处是,在属性编辑器中编辑控件的属性时,附加的属性将显示为控件属性集的一部分

        4
  •  0
  •   Alex Martelli    16 年前

    XML的命名规则得到了明确的解释,例如。 here :

    XML元素必须遵循以下命名规则 规则:

    • 名称可以包含字母、数字和其他字符
    • 名称不能以数字或标点符号开头
    • 名称不能以字母xml(或xml,或xml等)开头
    • 名称不能包含空格

    任何名字都可以使用,任何单词都不能使用 保留。

    我给出的URL继续提供“最佳实践”建议,其中包括

    避免”角色。如果你能说出 一些“名字”,一些软件 可能认为“名字”是 对象“第一”

    但是,这只是一个建议(打破它可能会使您的XML难以在某些软件中使用),就像agains使用的一样 - .在这些建议中,唯一真正重要的是避免使用 : 以XML名称(自那以后) 与XML名称空间冲突!-)。

        5
  •  0
  •   zar    5 年前

    简而言之,这纯粹是一个XAML构造,与XML无关。

    对于XML,使用类似点的名称 <ListBox.BorderThickness> 它本身就是一个唯一的标签名,点是名字的一部分,就像你可以有一个带有点的gmail id一样。它没有特别的重要性或意义。

    为什么XAML使用圆点?这只是一种XAML格式,意味着我们正在设置元素对象的上述属性。这基本上是为了让XAML引擎处理这一点,它还使XAML可读性强,易于理解。

    附加信息:很高兴知道。

    XAML本质上包含属性及其值对,因为它们代表相当复杂的对象(导致更深层的层次结构),所以它有助于确定哪个元素是属性,哪个元素是值。

    每当XAML编译器或您看到<X.Y>,这意味着正在设置X的Y属性。

    还值得注意的是,XAML不允许您仅为值插入任何XML代码,这些值总是封装在相关的XAML对象中,这就是它知道如何处理该值的方式。

    例如:

        <ComboBox>
            <ComboBoxItem>
                Item One
            </ComboBoxItem>
            <ComboBoxItem>
                Item Two
            </ComboBoxItem>
        </ComboBox>
    

    从概念上讲,很容易在上面看到这一点,但当然,常见的和推荐的语法如下所示,只是简短易懂:

        <ComboBox>
            <ComboBoxItem Content="Item One"/>
            <ComboBoxItem Content="Item Two"/>
        </ComboBox>
    

    在简单的情况下,这可能没有太多意义,但是想象一下您的组合框项是一个复杂的项(比如一个名为 House 这是两个属性 Bedrooms Baths )。然后ComboBoxItem将如下所示:

            <ComboBoxItem>
                <local:House Bedrooms="3" Baths="2"/>
            </ComboBoxItem>
    

    现在,由于它是ComboBoxItem,您可以选择它,等等,并对combobox中的一个项目执行任何操作。因为你有 <ComboBoxItem> 标记,您可以在其中包含任何复杂的结构(例如使用面板),XAML引擎将知道一个项目的所有内容。如果没有这个标签,它可能也会明白这一点,但是想象一下,对于一个人来说,阅读和理解代码有多困难。

    这也是为什么当你提供 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中通常有更深层的层次结构,从一件事到另一件事,再到另一件事,再到另一件事:)

    推荐文章