Как установить стиль кнопок программно (часть 2)? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь реализовать этот ответ (о том, как закруглить углы кнопки), но программно.

У меня есть:

Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(5)));
button.Style = style;

где button - кнопка. (Сюрприз!)

К сожалению, это ничего не значит для кнопки ...

1 Ответ

0 голосов
/ 12 марта 2020

Border.CornerRadiusProperty является свойством зависимости Border, установка его на Button ничего не даст.

Если вы поместите курсор редактирования на кнопку в своем окне XAML, go на странице свойств нажмите на маленький квадрат справа от «Разное -> Шаблон» и выберите «Преобразовать в новый ресурс», после чего VS расширит шаблон как локальный ресурс для просмотра и редактирования. Взгляд на этот шаблон показывает, что, хотя в шаблоне присутствует граница, она поддерживает только границы bru sh и толщины:

<Border x:Name="border"
    BorderBrush="{TemplateBinding BorderBrush}"
    BorderThickness="{TemplateBinding BorderThickness}"
    Background="{TemplateBinding Background}"
    SnapsToDevicePixels="True">

Так что, если вы хотите поддерживать углы на кнопках, вам понадобится изменить этот шаблон и создать свойство для его привязки, которое вы затем можете установить в объявлениях кнопок. Одним из способов сделать это является подкласс Button и добавление туда свойства, такого как BorderCornerRadius. Другой способ - создать вложенное свойство, которое затем можно применить к любому элементу framework, включая Button:

public static class ButtonHelper
{
    public static CornerRadius GetBorderCornerRadius(DependencyObject obj)
    {
        return (CornerRadius)obj.GetValue(BorderCornerRadiusProperty);
    }

    public static void SetBorderCornerRadius(DependencyObject obj, CornerRadius value)
    {
        obj.SetValue(BorderCornerRadiusProperty, value);
    }

    public static readonly DependencyProperty BorderCornerRadiusProperty =
        DependencyProperty.RegisterAttached("BorderCornerRadius", typeof(CornerRadius), typeof(ButtonHelper), new PropertyMetadata(new CornerRadius(0)));
}

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

<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
        CornerRadius="{Binding (local:ButtonHelper.BorderCornerRadius), RelativeSource={RelativeSource TemplatedParent}}"
        ... etc ...

Теперь вы можете использовать это вместо Border.CornerRadius. Чтобы сделать это в XAML, вы просто делаете это:

<Button x:Name="theButton" Width="100" Height="100"
        Template="{DynamicResource ButtonControlTemplate1}"
        local:ButtonHelper.BorderCornerRadius="20" />

Или вы можете сделать это с помощью code-behind, как в приведенном выше примере кода (не забывайте, что вам все равно нужно переопределить шаблон управления) :

Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(ButtonHelper.BorderCornerRadiusProperty, new CornerRadius(20)));
theButton.Style = style;

ОБНОВЛЕНИЕ: ответ, с которым вы связались, работает, изменив свойство для стиля Border по умолчанию, чего вы могли бы достичь в коде, сделав это вместо этого:

Style style = new Style(typeof(Border));
style.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(20)));
theButton.Resources.Add(typeof(Border), style);

Проблема в том, что он будет применен к всем границам в этой кнопке, не только к шаблону кнопки, но и к любому из содержимого или его DataTemplates et c. Рано или поздно, когда сложность вашего GUI возрастет, это может снова преследовать вас. В целом, я считаю, что, хотя ярлыки, подобные приведенным выше, позволят выполнить работу в краткосрочной перспективе, при правильном выполнении задач у вас будет гораздо меньше проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...