WPF中的关于控件button的小问题

"<Button Content="按钮"/>"和"<Button>按钮</Button>"的区别

阅读 5.3k
6 个回答

没有太大区别,写到属性可以绑定,写到标签内方便对Button布局进一步控制。

对于 WPF,可以为类型指定 ContentPropertyAttribute 特性,语法是这样的:

[ContentProperty(Name = "Content")]
public class Button
{
    public object Content { get; set; }
}

这段代码表示,在 Xaml 中使用这个类型的时候,以 Content 属性为 Xaml 内容属性,就会造成你描述的效果。
而内容属性的含义就是在 Xaml 中,哪个属性可以直接表示该元素的内容。

<Button Content="Click Me!"/>

<Button>
    <Button.Content>
        Click Me!
    </Button.Content>
</Button>

<Button>
    Click Me!
</Button>

这三种表达方式都是等价的。

参考:
https://msdn.microsoft.com/zh-cn/library/system.windows.markup.contentpropertyattribute(v=VS.110).aspx

没什么区别。除了前一个当作属性可以读取吧

没有区别,其实只是两种不同的写法而已,都可以。

<Button>content</Button>

这种方法具有良好的可扩展性,原因是其中的内容作为一个元素而不是属性出现,可以有:

<Button>
    <StackPanel>
        <Image/>
        <Label>...</Label>
        ...其他控件
    </StackPanel>
</Button>

这种内容控件经典的用法。

这是 XAML 的不同语法。
https://docs.microsoft.com/zh...

特性语法 (属性)
<Button Background="Blue" Foreground="Red" Content="This is a button"/>
属性元素语法
<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>
集合语法
<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->  
    <GradientStop Offset="0.0" Color="Red" />  
    <GradientStop Offset="1.0" Color="Blue" />  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>
XAML 内容属性
<Border>  
  <TextBox Width="300"/>  
</Border>  

等效于:

<Border>  
  <Border.Child>  
    <TextBox Width="300"/>  
  </Border.Child>  
</Border>