Я как-то заметил, что пока я создаю элемент управления в своем приложении, он сначала выглядит как странный прямоугольник, а затем «сжимается» до правильной формы.

Первое, что вы увидите после создания

Правильно созданный объект

У меня вопрос, почему я сначала вижу прямоугольник в верхнем левом углу, а затем он внезапно принимает правильную форму. Это похоже на долю секунды (мне пришлось использовать Thread.Sleep, потому что невозможно сделать снимок экрана), но мои глаза все еще видят это, и я действительно срабатываю, когда это происходит.

Это код, в котором я создаю элемент управления:

var label = new Label
{
    AutoSize = true,
    TextAlign = ContentAlignment.MiddleLeft,
    Font = new Font("Courier New", 9F, FontStyle.Regular,
        GraphicsUnit.Point, 238),
    Text = keyword,
    Margin = new Padding(0, 6, 25, 3),
    Padding = new Padding(0, 3, 0, 0)
};

var button = new Button
{
    BackgroundImage = Image.FromFile("../../../Images/cross_200x200.png"),
    BackgroundImageLayout = ImageLayout.Stretch,
    Dock = DockStyle.Right,
    Width = 21,
    Height = 21,
    FlatStyle = FlatStyle.Flat,
};
button.FlatAppearance.BorderSize = 0;

var pan = new Panel
{
    AutoSize = true,
    Padding = new Padding(0, 0, 1, 1),
    BackColor = Color.PowderBlue,
    BorderStyle = BorderStyle.FixedSingle,
    Tag = keyword
};

button.Click += delegate
{
    _keywords.Remove(pan.Controls.OfType<Label>().First().Text);
    pan.Dispose();
    StatusLabel.Text = $@"Removed {keyword}";
};

pan.Controls.Add(label);
pan.Controls.Add(button);

FlowLayoutPanelMain.Controls.Add(pan);

Каждый раз, когда «ключевое слово» добавляется в элемент управления FlowLayoutPanel, сначала это прямоугольник в верхнем левом углу, а сразу после этого все в порядке.

2
u š κ o 17 Июл 2020 в 11:40

1 ответ

Лучший ответ

С помощью моего друга мы выяснили, что это происходит из-за старой технологии Windows Forms (вероятно, этого не происходит в WPF .NET Core) и невозможности создания элементов управления во время выполнения. Итак, предлагаемое решение для этого, кажется, просто .Hide() элемент управления, .Add() его для FlowLayoutPanel, а затем просто .Show() его обратно, теперь мои глаза будут довольны.

...

pan.Hide();
FlowLayoutPanelMain.Controls.Add(pan);
pan.Show();

...
1
u š κ o 17 Июл 2020 в 09:46