2009-06-23 165 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