WPF:如何使用BasedOn Style

时间:2015-08-08 20:07:41

标签: wpf styles basedon

我是WPF的新手,我创建了以下简单的样式示例。但它没有正常工作,而按钮的内容并没有显示,尽管我仍然可以点击它。谁能告诉我为什么它会被打破?

<Window.Resources>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border BorderBrush="Blue" 
                            BorderThickness="5" 
                            Background="Aqua"
                            Width="80"
                            Height="40">
                        <ContentPresenter></ContentPresenter>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="Grid" x:Name="GridWithMarginStyle">
        <Setter Property="Margin" Value="12"></Setter>
    </Style>

</Window.Resources>
<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
            <EventSetter Event="Button.Click" Handler="ButtonHandler" />
            <Setter Property="Background" Value="Red"></Setter>
            <Setter Property="Foreground" Value="White"></Setter>
        </Style>
    </StackPanel.Resources>
    <Button Name="OkBtn">OK</Button>
    <Button Name="CancelBtn" Click="CancelBtn_Click">Cancel</Button>
</StackPanel>

1 个答案:

答案 0 :(得分:1)

您正在以正确的方式使用BasedOn属性。问题是你的ContentPresenter没有绑定到它呈现的控件(即按钮)。

试着用这个替换你的ControlTemplate XAML:

<ControlTemplate TargetType="{x:Type Button}">
    <Border BorderBrush="Blue" 
        BorderThickness="5" 
        Background="Aqua"
        Width="80"
        Height="40">
        <ContentPresenter Content="{TemplateBinding Content}" />
    </Border>
</ControlTemplate>

使用TemplateBinding,您可以将ContentPresenter绑定到模板化控件的Content属性。