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

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

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

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

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

Спасибо

1 Ответ

3 голосов
/ 15 апреля 2011

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

...