如何将模板与样式绑定?

时间:2012-06-22 15:26:00

标签: c# wpf templates xaml styles

我有一个C#WPF应用程序,我需要创建一堆不同颜色的图像/文本按钮。为此,我创建了一个派生自Button类的ImageButton。

我希望我的按钮有圆角,所以我创建了以下控件模板:

    <ControlTemplate x:Key="RoundedButtonTemplate" TargetType="{x:Type MyProject:ImageButton}">
        <Grid>
            <Border x:Name="border" Background="WHAT DO I PUT HERE?" CornerRadius="10"/>
        </Grid>         
    </ControlTemplate>

现在我想通过更改XAML中的样式轻松地更改上面边框的颜色。我定义了以下样式。

绿色按钮样式:

    <Style x:Key="GreenButtonStyle" TargetType="{x:Type MyProject:ImageButton}">
        <Setter Property="Background" Value="{DynamicResource GreenButtonBrush}"/>
RoundedButtonTemplate}"/>
    </Style>

蓝色按钮样式:

    <Style x:Key="GreenButtonStyle" TargetType="{x:Type MyProject:ImageButton}">
        <Setter Property="Background" Value="{DynamicResource BlueButtonBrush}"/>
RoundedButtonTemplate}"/>
    </Style>

我的客户端代码如下所示:

<local:ImageButton HorizontalAlignment="Left" Margin="24,19.234,0,20" Width="97" Grid.Row="3" Style="{DynamicResource GreenButtonStyle}" Template="{DynamicResource RoundedButtonTemplate}"/>

我的问题是如何让模板知道要使用哪种风格?我尝试将以下属性添加到我的样式中,但没有取得多大成功:

<Setter Property="Template" Value="{DynamicResource RoundedButtonTemplate}"/>

2 个答案:

答案 0 :(得分:0)

我猜测ImageButton继承自UserControl,因为这是一个复合控件。如果没有,你可能应该。 MSDN讨论从Control vs UserControl继承。我会把Border放在那里,然后放在Button和TextBlock里面。

执行此操作的一种方法是在新的ImageButton类上定义依赖项属性,类似“BorderBackground”。您可以将其链接以在设置时更改边框的背景颜色。如果您愿意,我可以提供示例代码。

设置样式时,目标属性为“BorderBackground”。这将消除对ControlTemplate进行任何更改的需求,我通常会尽量避免这种更改。

这有帮助吗?

或者回答你原来的问题,我不确定模板是否知道如何应用样式,因为你的样式的目标是ImageButton控件的背景,而不是Border控件的背景。

答案 1 :(得分:0)

我想我明白了。所需要的只是在我的模板定义中放置以下文本:

Background="{TemplateBinding Background}"

可以在本文中找到更多信息: TemplateBinding: a bridge between styles and templates