UserControl中的参数化样式?

时间:2012-02-13 17:17:01

标签: wpf user-controls styles

我使用this MSDN tutorial为我窗口的所有Button控件创建一个眼睛糖果外观,并且运行正常。

为了使其更具可重用性,我尝试将所有内容放入UserControl中:我创建了一个ImageButton UC,然后将<Style>中的所有<Window.Resources>封装到<UserControl.Resources>

然后我在XAML中更改了我的Button实例,来自:

<Button Tag="Face.jpg" Content="Foo" />

要:

<uc:ImageButton Tag="Face.jpg" Content="Foo" />

风格停止应用。

这是UC代码:

<UserControl x:Class="GDTI.UI.Main.View.UserControls.ImageButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<UserControl.Resources>
    <Style TargetType="Button">
        <Setter Property="MaxWidth" Value="250" />
        <Setter Property="Margin" Value="5" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="Foreground" Value="White" />

        <Setter Property="Background" >
            <Setter.Value>
                <SolidColorBrush Color="Orange" Opacity="0.4" />
            </Setter.Value>
        </Setter>

        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate >
                    <StackPanel>
                        <Image Source="{Binding Tag,
                            RelativeSource={RelativeSource
                                              FindAncestor,
                                              AncestorType='Button'}}" />
                        <TextBlock Margin="10"
            HorizontalAlignment="Center"
            Text="{Binding Content,
                     RelativeSource={RelativeSource
                                       FindAncestor,
                                       AncestorType='Button'}}" />
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</UserControl.Resources>

<Button/>

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

按钮上按钮式目标属性中的绑定,不再设置属性。如果你想保留风格的完整性,你需要将它们转发到UserControl

<!-- Inside UserControl declaration -->
<Button Content="{Binding Caption, RelativeSource={RelativeSource AncestorType=UserControl}}"
        Tag="{Binding ImageSource, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

在UserControl上定义CaptionImageSource应该是新的dependency properties(在代码隐藏中)。

请注意,您永远不能绑定到Content中的UserControl(因此Caption属性),此处Button本身 Content的{​​{1}}。

或者,您可以通过将UserControl更改为AncestorType来绕过UserControl,直接更改样式中的定位。超出模板控制的绑定并不是很好的练习,但你仍然在Button内,所以它可能是可以原谅的。

无论哪种方式,这都有点hacky而且从UserControl继承可能更好。