Свойство C# Anchor не работает

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

Например, у меня есть две кнопки в правом нижнем углу формы - они на форме, без контейнеров или чего-то в этом роде. Якорь = Внизу, Справа. FormBorderStyle = Большой. Но когда я перетаскиваю форму во время работы, кнопки не двигаются.

Я что-то упускаю?

c# 2005


person flamey    schedule 21.10.2009    source источник
comment
Это всегда работало для меня в прошлом, поэтому я предполагаю, что вы делаете что-то не так. Можете ли вы опубликовать пример кода (загляните в файл Designer.cs) или, возможно, снимок экрана, демонстрирующий проблему.   -  person Simon P Stevens    schedule 21.10.2009
comment
Добавьте новую форму, добавьте кнопку и установите Anchor на Bottom, Right. Если это действительно работает, это означает, что что-то не так в том, как все делается в вашей исходной форме - см. ответы других, чтобы понять это. Если новая форма не работает, я понятия не имею, что не так...   -  person awe    schedule 21.10.2009


Ответы (9)


Другая возможность заключается в том, что вы случайно разместили свои кнопки не прямо на форме. Вместо этого вы помещаете их в какой-либо контейнер (например, панель, tableLayoutPanel и т. д.), и этот контейнер не имеет правильных значений привязки или стыковки.

Просто чтобы быть абсолютно уверенным, вы должны заглянуть в Designer.cs и проверить, добавляются ли ваши кнопки непосредственно в форму с помощью функции this.Controls.Add() или они добавляются в какой-либо другой список элементов управления (например, panel.Controls.Add()).

person Oliver    schedule 21.10.2009
comment
Если вам нужен иерархический обзор всех ваших элементов управления в форме, просто откройте панель «Структура документа». В режиме конструктора перейдите в Вид -> Другие окна -> Структура документа. - person Mez; 21.10.2009
comment
И только что узнал кое-что новое... Я не знал "Структура документа", но я даю отличный иерархический обзор, а также поддерживаю перетаскивание! - person Oliver; 26.10.2009
comment
Я только начинаю понимать, что происходит и как это обойти, но FlowLayoutPanels, похоже, действительно портит поведение привязки. Здесь есть небольшая информация, не уверен, насколько она актуальна docs.microsoft.com/en-us/dotnet/framework/winforms/controls/ - person Toadfish; 28.08.2017
comment
@Toadfish: Статья мне кажется хорошей. Если у вас есть проблемы с пониманием стыковки и привязки, вам не следует начинать использовать их в FlowLayoutPanel. Если у вас есть конкретная проблема или пример, который не соответствует вашим ожиданиям, просто задайте новый вопрос и дайте мне знать. - person Oliver; 28.08.2017

Я знаю, что это старый пост, но я все равно хотел бы внести свой вклад.

Моя проблема заключалась в том, что форма, которую я добавлял в свою панель, не настраивала свой размер автоматически, когда размер родительской панели изменялся.

Проблема была в том, что я делал это:

form.WindowState = FormWindowState.Maximized; // <-- source of the problem
form.AutoSize = true; //this causes the form to grow only. Don't set it if you want to resize automatically using AnchorStyles, as I did below.
form.FormBorderStyle = FormBorderStyle.Sizable; //I think this is not necessary to solve the problem, but I have left it there just in case :-)
panel1.Controls.Add(form);
form.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                    | System.Windows.Forms.AnchorStyles.Left)
                    | System.Windows.Forms.AnchorStyles.Right)));
form.Dock = DockStyle.Fill; //this provides the initial size adjust to parent' size.
form.Visible = true;

Чтобы решить эту проблему, я просто прокомментировал первую строку //form.WindowState = FormWindowState.Maximized;, и все заработало как часы.

person Roberto    schedule 11.09.2011

Кроме того, если у вас установлено свойство автоматического размера, это вызовет проблемы.

person Bostwick    schedule 16.11.2010

Какое значение имеет свойство Dock? Это может свести на нет свойства привязки.

person user    schedule 21.10.2009
comment
да, если вы не устанавливаете свойство привязки, но устанавливаете свойство док-станции, меню не перемещается при изменении размера - person Commonaught; 11.08.2020

У меня такая же проблема в бета-версии VS11. Я много раз пользовался анкорами и они всегда работали нормально, но теперь я не могу понять, что с ними происходит и не только - заливка дока тоже не работает! (автоматический размер или свойства док-станции не используются)

P.S. (через 40 минут) Теперь похоже, что я нашел проблему: у меня есть прослушиватель событий Resize для PictureBox, и я создаю новое изображение для нового размера изображения в обработчике onResize. Когда я удаляю создание нового образа, все работает!

Теперь я использую событие SizeChanged и в обработчике этого события создаю новое изображение. Поэтому я думаю, что мне не следует менять объект-отправитель до завершения изменения размера.

person porfirion    schedule 25.08.2012

У меня была точно такая же проблема.

Ситуация:

TableLayoutPanel с одной строкой, установленной на autosize. В этом ряду анкеровка справа, снизу НЕ работала. Удаление autoSize и размещение его на фиксированной высоте решило проблему, как это было предписано пользователем 428955.

person Starceaker    schedule 29.09.2011

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

person jonathana    schedule 29.08.2017

Если ваша форма является локализуемой, проверьте, не вносили ли вы какие-либо изменения привязки/док-станции на другом языке.

person Daumantas Drukteinis    schedule 04.10.2018

У меня тоже была похожая проблема. Я обнаружил, что это произошло из-за того, что я менял размер формы на form_load. Это можно обойти, временно закрепив форму сверху/слева при изменении размера формы.

    private void ResizeFromDesigntimeToRunTime()
    {
        var volatileControls = this.Controls.Cast<Control>().Where(control => (control.Anchor | AnchorStyles.Bottom | AnchorStyles.Right) != AnchorStyles.None).ToList();

        var anchorPairing = volatileControls.ToDictionary(control => control, control => control.Anchor);

        foreach (var control in volatileControls)
            control.Anchor = AnchorStyles.Left | AnchorStyles.Top; //Temporarily reset all controls with an anchor including right or bottom, so that these aren't automatically resized when we adjust form dimensions.

        this.Height = SomeHeight;
        this.Width = SomeWidth;

        foreach (var pair in anchorPairing)
            pair.Key.Anchor = pair.Value;
    }
person Jack    schedule 07.08.2019