Intereting Posts
Получение единства для разрешения нескольких экземпляров одного типа Почему деление int.MinValue на -1 бросило OverflowException в неконтролируемый контекст? Каковы преимущества использования , а не в WCF Как получить имя метода единичного теста во время выполнения внутри модульного теста? Как добавить ScrollBar в стеке Преобразование Direct Acitlic Graph (DAG) в дерево Почему ReSharper говорит мне «неявно зафиксированное закрытие»? Как добавить текст в RichTextBox без прокрутки и проигрывания выбора? Включение зависимости в CustomAttribute с помощью Castle Windsor Проверяются ли параметры в порядке, когда они передаются в метод? Ошибка префикса .NET HttpListener с чем-либо, кроме localhost Устройство чтения данных несовместимо с указанной инфраструктурой Entity Framework Какой тип IProducerConsumerCollection использовать для моей задачи? Как ограничить операции ввода-вывода в приложении .NET? Зачем создавать проект библиотеки classов ASP.NET 5?

Установите CornerRadius на шаблон кнопки

Я хочу, чтобы Button, который не определяет CornerRadius и двух других, которые делают, как я могу достичь этого?

                    

Поскольку Nitesh сказал, что у вас нет свойства CornerRadius на Button, это свойство границы, как вы показали в своем первом стиле, просто дублируйте свой первый стиль и измените CornerRadius, а затем назначьте его стилю соответствующего Кнопка.

             

введите описание изображения здесь

Вы не ограничены зависимыми свойствами управляющего шаблона. В этом случае, хотя Button не имеет свойства CornerRadius , Border делает, поэтому вы можете использовать Border.CornerRadius вместо этого:

    

При таком подходе вам больше не нужно поддерживать несколько копий вашего шаблона управления.

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

    

Я бы сделал собственный собственный class кнопок (унаследованный от Button), который включает свойство зависимостей CornerRadius. И тогда целевой тип вашего стиля станет новым classом, и вы можете использовать привязку шаблона для установки радиуса угла.

При таком подходе вам не нужно поддерживать несколько копий вашего шаблона управления, но вам не нужно создавать новый стиль для каждого раза, когда вы хотите изменить свой угловой радиус. Вы можете просто установить или привязать непосредственно к свойству зависимости CornerRadius.

Таким образом, ваш код для элемента управления может выглядеть примерно так:

 public class MyCustomButton : Button { public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MyCustomButton), new FrameworkPropertyMetadata(new CornerRadius(0))); public CornerRadius CornerRadius { get { return (CornerRadius)GetValue(CornerRadiusProperty); } set { SetValue(CornerRadiusProperty, value); } } } 

И XAML:

  

Поэтому для ваших кнопок, которые не нуждаются в радиусе угла, поскольку свойство зависимостей по умолчанию равно 0, вам не нужно ничего делать. Для тех, у которых есть радиус угла, вы просто устанавливаете свойство зависимостей на соответствующее значение, как и свойство CornerRadius для нормальной границы.

Вы можете использовать прикрепленные свойства для установки радиуса границы кнопки (также то же самое будет работать для текстовых полей).

Создать class для прикрепленного свойства

 public class CornerRadiusSetter { public static CornerRadius GetCornerRadius(DependencyObject obj) => (CornerRadius)obj.GetValue(CornerRadiusProperty); public static void SetCornerRadius(DependencyObject obj, CornerRadius value) => obj.SetValue(CornerRadiusProperty, value); public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached(nameof(Border.CornerRadius), typeof(CornerRadius), typeof(CornerRadiusSetter), new UIPropertyMetadata(new CornerRadius(), CornerRadiusChangedCallback)); public static void CornerRadiusChangedCallback(object sender, DependencyPropertyChangedEventArgs e) { Control control = sender as Control; if (control == null) return; control.Loaded += Control_Loaded; } private static void Control_Loaded(object sender, EventArgs e) { Control control = sender as Control; if (control == null || control.Template == null) return; control.ApplyTemplate(); Border border = control.Template.FindName("border", control) as Border; if (border == null) return; border.CornerRadius = GetCornerRadius(control); } } 

Затем вы можете использовать синтаксис прикрепленного свойства для создания нескольких кнопок без дубликатов стилей: