Передача параметров в шаблон - PullRequest
3 голосов
/ 23 июня 2009

Скажите, что я определил кнопку с закругленными углами.

<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 ]

6 голосов
/ 23 июня 2009

В дополнение к предложениям Кента вы также можете создать прикрепленное свойство, чтобы определить CornerRadius для кнопки, и связать это свойство в шаблоне

4 голосов
/ 23 июня 2009

Чтобы использовать TemplateBinding, в шаблонном элементе управления должно быть свойство (Button, в данном случае). Button не имеет CornerRadius или эквивалентного свойства, поэтому вы можете выбрать:

  • жесткий код значения в шаблоне
  • Перехватите другое свойство (например, Tag) для хранения этой информации. Это быстрее, но ему не хватает безопасности типов, его сложнее поддерживать и не позволяет использовать это свойство другими способами.
  • Подкласс Button и добавьте нужную вам недвижимость, затем предоставьте шаблон для этого подкласса. Это занимает немного больше времени, но дает гораздо более приятный опыт потребителям вашего контроля.
1 голос
/ 23 июня 2009

Тип кнопки не имеет свойства для 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 теперь будет работать без проблем.

...