WPF - Установка радиуса угла в коде позади

Я хочу добавить несколько прямоугольников на свои страницы WPF, эти прямоугольники должны иметь закругленные углы. Чтобы вывести на страницу несколько прямоугольников без необходимости писать каждый из них в xaml, я решил сделать это с помощью цикла в коде. Я пробовал вот это:

for (int i = 0; i < 5; i++)
{             
    Rectangle rect = new Rectangle();
    rect.Fill = System.Windows.Media.Brushes.Green;

    var style = new Style(typeof(Border));
    style.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(12.0, 0, 0 , 0)));
    rect.Resources.Add(typeof(Border), style);

    Grid.SetColumn(rect, 1);
    Grid.SetRow(rect, 1);
    mainGrid.Children.Add(rect);                    
}

но угловой радиус моих прямоугольников не изменится. У вас есть какие-либо предложения?

Заранее спасибо за помощь!


person VR46_Italia    schedule 15.03.2021    source источник
comment
вы можете использовать стили и шаблоны для этого. изменять что-либо из кода - плохая идея   -  person ba-a-aton    schedule 15.03.2021
comment
этот ответ и эта статья, вероятно, должен вам помочь   -  person ba-a-aton    schedule 15.03.2021
comment
Спасибо за ответы! Только что заметил, что есть RadiusX и RadiusY, как сказал @Blindy. Это хорошо сработало. Однако я посмотрю на MVVM, поскольку пока не об этом.   -  person VR46_Italia    schedule 15.03.2021


Ответы (2)


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

Хорошая проблема, которую нужно решить.

Решил сделать это с помощью цикла в коде

Совершенно плохое решение. Используйте правильный MVVM с <ItemsControl>, привязанным к вашему списку объектов, которые вы пытаетесь отобразить, хранящимся в вашей модели представления. А затем создайте глобальную таблицу стилей и примените ее к ней автоматически или вручную.

В любом случае, чтобы ответить на ваш вопрос, вы создаете безымянный стиль на Border и применяете его к Rectangle. Это никогда не будет применяться автоматически, и это хорошо, потому что вы ссылаетесь на Border.CornerRadiusProperty, которого нет на Rectangle.

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

Однако ваш код не имеет для меня смысла, Rectangle также имеет свойства радиуса угла, RadiusX и RadiusY, вы можете просто установить их, если хотите.

person Blindy    schedule 15.03.2021

Прямоугольник переполнен. Если вы сделаете то же самое с рамкой, это сработает. Когда вы добавляете прямоугольник внутри границы, вы можете видеть, что он делает

        Rectangle rect = new Rectangle();
        rect.Fill = System.Windows.Media.Brushes.Green;

        Border b = new Border();
        b.Width = 100;
        b.Height = 100;
        b.Background = Brushes.White;
        b.CornerRadius= new CornerRadius(12, 0, 0, 0);
        b.BorderThickness = new Thickness(2);
        b.BorderBrush = Brushes.Red;
        b.Child = rect;//adding this rectangle will show you how the corner is overflowing
        grid_Main.Children.Add(b);
person Wanderer11    schedule 15.03.2021