如何将Control和ContentControl的继承属性“传递”到UserControl中的元素?

时间:2013-01-03 17:14:06

标签: c# wpf xaml

WPF问题。我不确定要谷歌用什么。

我有一个usercontrol:

<UserControl x:Class="MyProj.MyControl"
             x:Name="Self"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button />
</UserControl>

我这样用:

<local:MyControl Background="Green" />

但背景似乎没有改变。这是因为按钮的背景没有改变。我希望按钮的背景使用usercontrol的背景。

我想我可以这样做:

<UserControl x:Class="MyProj.MyControl"
             x:Name="Self"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button Background="{Binding Path=Background, ElementName=Self" />
</UserControl>

但我非常希望Control和ContentControl中的所有继承属性都应用于按钮(ToolTip,BorderThickness,BorderBrush等)。

那么我该怎么办呢?

<UserControl x:Class="MyProj.MyControl"
             x:Name="Self"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button Background="{Binding Path=Background, ElementName=Self"
            ToolTip="{Binding Path=ToolTip, ElementName=Self"
            BorderThickness="{Binding Path=BorderThickness, ElementName=Self"
            BorderBrush="{Binding Path=BorderBrush, ElementName=Self"
            ...
            ...
            ...
            ... />
</UserControl>

(注意:这是一个较小的(我实际上可以管理的最小)一个较大的UserControl示例,它包含许多控件。)

1 个答案:

答案 0 :(得分:1)

唉。那么,简短的回答:你不能,至少不容易。 XAML不像HTML / CSS那样工作。 Button(就此而言,几乎任何Control)默认情况下不会从其容器继承属性。

可以制作您自己的Button等继承的控件...或者,您可能能够声明适用于所有内容的Style并尝试抓住任何包含元素的属性(即通过RelativeSource FindAncestor)...或者你可以做你在这里做的事情:手动设置每个属性。

Style方法的示例:

<Style TargetType="{x:Type Control}">
    <Setter 
        Property="Background" 
        Value="{Binding (Control.Background), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}}"/>
</Style>