2015-08-08 28 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'有點慢。 –