2009-06-23 160 views
3

說我定義了一個圓角的按鈕。將參數傳遞給模板

<Style x:Key="RoundButton" TargetType="Button"> 
    <!-- bla bla --> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border CornerRadius="0,5,5,0" /> 
       <!-- bla bla --> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我可能該按鈕的用戶可以指定CornerRadius?我可以使用TemplateBinding嗎?但我應該在哪裏綁定? (to tag?)

回答

4

爲了使用TemplateBinding,在模板控件上必須有一個屬性(在本例中爲Button)。 Button沒有CornerRadius或等價的屬性,所以你的選擇是:

  • 硬編碼模板
  • 劫持值的另一個屬性(如Tag)來存儲這些信息。這更快,但缺乏類型安全性,難以維護,並且阻止該財產的其他用途。
  • 子類Button並添加您需要的propery,然後爲該子類提供模板。這需要更長的時間,但爲您的控制消費者帶來更好的體驗。
6

除了肯特的建議,你也可以創建一個附加的屬性來定義按鈕上的CornerRadius,並綁定到該屬性模板

+0

+1好點 - 忘了那個。 – 2009-06-23 08:38:54

1

按鈕類型不具有CornerRadius屬性,所以模板化是不可能的。我認爲最簡單的方法是創建一個從Button繼承的新類,併爲CornerRadius添加一個新的依賴項屬性。就像這樣:

using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication3 
{ 
    public class RoundedButton:Button 
    { 
     public CornerRadius CornerRadius 
     { 
      get { return (CornerRadius) GetValue(CornerRadiusProperty); } 
      set { SetValue(CornerRadiusProperty, value); } 
     } 
     public static readonly DependencyProperty CornerRadiusProperty = 
      DependencyProperty.Register("CornerRadius", typeof (CornerRadius), 
      typeof (RoundedButton), new UIPropertyMetadata()); 
    } 
} 

在XAML中,你可以使用它像:

<Local:RoundedButton 
    Style="{DynamicResource RoundButton}" 
    Width="64" Height="32" 
    Content="Hello" 
    CornerRadius="1,5,10,5" 
    Background="#FF9CFFD5" />  

模板結合CornerRadius會不會有問題的工作現在。

+0

我遇到了您提出的方法問題。如果將CornerRadius放入RoundButton樣式中,則不會將其應用於該按鈕。 – EngineerSpock 2013-10-09 10:42:30