Привязать значение свойства шаблона к свойству шаблонного элемента управления

#silverlight #templates #custom-controls #expression-blend

#silverlight #шаблоны #пользовательские элементы управления #выражение-смешивание

Вопрос:

Заголовок немного нечеткий, проблема в:

Я внедряю кнопку Silverlight 4, заменяя шаблон своим собственным. Возможно ли привязать радиус угла границы к высоте кнопки?

Например, пользователь может установить высоту в конструкторе равной 30, тогда радиус угла внутренней границы шаблона должен быть равен 15. Если высота равна 50, то радиус угла должен быть 25 и т.д.

Если возможно, мне нужно чистое решение на XAML.

Спасибо

Ответ №1:

Это не чисто 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));
    }

}
  

В themes/ 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 свойства при привязке шаблона. Конечно, теперь вы переключаетесь обратно на blend, добавляете этот элемент управления на поверхность и проявляете творческий подход к стилю.