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

Название немного расплывчатое, проблема в следующем:

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

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

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

Спасибо


person Valentin V    schedule 15.04.2011    source источник


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

person AnthonyWJones    schedule 15.04.2011