将模板属性值绑定到模板化控件属性

问题描述

| 标题有点模糊,问题是: 我正在通过与自己的模板交换来实现Silverlight 4按钮。是否可以将边框角半径绑定到按钮高度? 例如,用户可以将设计器中的高度设置为30,然后模板内边框的角半径应为15。当高度为50时,角半径应为25,依此类推。 如果可能,我需要一个纯XAML解决方案。 谢谢     

解决方法

这不是纯Xaml解决方案。最终,您至少需要执行y / 2表达式,而这不是任何现有的基于Xaml的组件当前提供的。 在Vs2010中打开该项目。添加一个新项目... \“ Silverlight模板控件\”将其命名为\“ RoundEndedButton \”。 将源替换为:-
public class RoundEndedButton : Button
{
    public RoundEndedButton()
    {
        this.DefaultStyleKey = typeof(RoundEndedButton);
        SizeChanged += new SizeChangedEventHandler(RoundEndedButton_SizeChanged);
    }

    public static readonly DependencyProperty CornerRadiusProperty =
        DependencyProperty.Register(
            \"CornerRadius\",typeof(CornerRadius),typeof(RoundEndedButton),new PropertyMetadata(new CornerRadius()));

    void RoundEndedButton_SizeChanged(object sender,SizeChangedEventArgs e)
    {
        SetValue(CornerRadiusProperty,new CornerRadius(e.NewSize.Height / 2));
    }

}
在主题/Generic.xaml中修改其默认模板。这是我非常简单的示例:-
<Style TargetType=\"local:RoundEndedButton\">
    <Setter Property=\"Template\">
        <Setter.Value>
            <ControlTemplate TargetType=\"local:RoundEndedButton\">
                <Border x:Name=\"Background\" 
                        Background=\"{TemplateBinding Background}\"
                        CornerRadius=\"{TemplateBinding CornerRadius}\"
                        BorderThickness=\"{TemplateBinding BorderThickness}\"
                        BorderBrush=\"{TemplateBinding BorderBrush}\">
                    <ContentPresenter
                        x:Name=\"contentPresenter\"
                        Content=\"{TemplateBinding Content}\"
                        ContentTemplate=\"{TemplateBinding ContentTemplate}\"
                        VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"
                        HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"
                        Margin=\"{TemplateBinding Padding}\"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
请注意,在模板绑定中使用了额外的
CornerRadius
属性。当然,现在您可以切换回混合,将此控件添加到曲面上,并在样式上发挥创意。