2015-08-08 25 views
0

我是WPF的新手,我创建了以下简单样式示例。但它不能正常工作,按钮的内容不显示,但我仍然可以点击它。谁能告诉我它为什么坏了?WPF:如何使用BasedOn风格

<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

您正在以正确的方式使用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财产。

+0

感谢您的快速回答。我必须使用来代替才能使其工作。但你给我一些想法该怎么做。谢谢。 – SunnyRain

+0

这很奇怪。我尝试了.NET Framework 4.0的XAML,并且它可以工作。我可以问你使用哪个框架版本吗?无论如何,'TemplatedParent'应该可以工作在任何你使用的版本上。你的解决方案没有错,但是AFAIK的RelativeSource TemplatedParent比使用'TemplatedParent'有点慢。 –