将参数传递给模板

时间:2009-06-23 07:57:15

标签: c# .net wpf xaml controltemplate

假设我已经定义了一个带圆角的按钮。

<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吗?但是我应该在哪里绑定? (到标签?)

3 个答案:

答案 0 :(得分:6)

除了Kent的建议之外,您还可以创建一个附加属性来定义按钮上的CornerRadius,并绑定到模板中的该属性

答案 1 :(得分:4)

为了使用TemplateBinding,模板化控件(Button)上必须有一个属性(在本例中)。 Button没有CornerRadius或同等属性,因此您的选项为:

  • 对模板中的值进行硬编码
  • 劫持另一个属性(例如Tag)以存储此信息。这样做更快,但缺乏类型安全性,难以维护,并且阻止了该属性的其他用途。
  • 子类Button并添加您需要的属性,然后为该子类提供模板。这需要更长的时间,但为您控制的消费者带来更好的体验。

答案 2 :(得分: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的模板现在可以正常运行。