Пользовательское закрепление в Windows Forms - PullRequest
3 голосов
/ 10 августа 2011

У меня есть пользовательская форма с 4 панелями по краям.Я хотел бы привязать другую панель, которая будет содержать пользовательские элементы управления, к видимым краям формы.Как только это будет сделано, я бы хотел привязать неопределенное количество элементов управления к уже закрепленной панели.Я довольно новичок в этом, и я не знаю, что это лучший способ достичь моей цели - иметь список объектов, размер которых изменяется при изменении размера формы.Причина, по которой я работаю с этой точки зрения, заключается в том, что я хочу, чтобы объекты были активными, а не просто текстовыми строками.

Моя мысль примерно такая.

----------------------------------------
| Header Panel                         |
----------------------------------------
|| <--left panel         right panel->||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
----------------------------------------
| Bottom Panel                         |
----------------------------------------

В настоящее время я могу нарисовать панель, которая содержит объекты пользовательского элемента управления по желанию, но не меняет размер с родительским, и когда я пытаюсь привязать его к родительскому объекту, он привязывается кне то место.Я также пытался привязать объекты управления пользователя к панели управления пользователя, но они не меняют размеры вообще.

Итак, вот код для панели контейнера

//This is called after InitializeComponent(), I would assume the anchor would go 
//in here somewhere, but I need the anchor to be offset by the bounds of the 
//other panels as listed below.
private static void SetQuestionContainerBounds(SessionReviewForm instance)
{
   instance.pnlQuestionContainer.Top = instance.HeaderPanel.Bottom;
   instance.pnlQuestionContainer.Left = instance.LeftPanel.Right;
   instance.pnlQuestionContainer.Width = instance.RightPanel.Left - instance.pnlQuestionContainer.Left;
   instance.pnlQuestionContainer.Height = instance.StatusPanel.Top - instance.pnlQuestionContainer.Top;
}

После того, как я создаю форму и позиционирую pnlQuestionContainer, я затем начинаю создавать пользовательские элементы управления, называемые объектами базовых вопросов, привязывать их и добавлятьих в pnlQuestionContainer

private void DisplayData()
{
// tracks the number of questions, used in placement of objects
int questionCount = 0;

// if the session question is marked for review
// generate a new question object and place it.
foreach (SessionQuestion sq in thisSessionPart.SessionQuestions)
{
    if(sq.MarkForReview)
    {
        BaseQuestionObject bqo = new BaseQuestionObject(sq, parentSession);

        BaseQuestionObject.FitAndPlaceObject(pnlQuestionContainer, bqo, questionCount);

        bqo.Anchor = (AnchorStyles.Left | AnchorStyles.Right);

        pnlQuestionContainer.Controls.Add(bqo);

        questionCount++;
    }
}
}

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

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


[РЕДАКТИРОВАТЬ] Проблема, с которой я столкнулся, заключалась в том, что стили якоря плохо играли с авторазмером.После выключения автоматического изменения размера и манипуляции с anchorStyles я смог получить желаемый результат.

1 Ответ

4 голосов
/ 10 августа 2011

Во-первых, я не уверен на 100% в том, что вы пытаетесь сделать, но привязка намного проще, чем способ, которым вы пытаетесь его достичь.

У каждого элемента управления есть свойство под названием Anchor, котороеявляется перечислением AnchorStyles .Этими значениями могут быть «Левый», «Правый», «Верхний», «Нижний» или «Нет», и они могут быть разбиты на биты ИЛИ объединены для обеспечения нескольких значений привязки.

Значением по умолчанию «Якорь» является Верхний левый.Если вы измените привязку на Top-Right, ваши элементы управления останутся того же размера, но будут «плавать» с правой стороны окна вашего приложения при его изменении.Если вы привязываетесь к левому, верхнему и правому краям, ваши элементы управления будут увеличиваться и уменьшаться по мере изменения ширины окна.

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

Кроме того, если вы хотите переупорядочить содержимое вашей формы по мере увеличения и уменьшения окна, стандартная панель инструментов MS имеет несколько элементов управления, которые вы можетеможно поиграть с.В частности, проверьте FlowLayoutPanel и TableLayoutPanel .Вы можете использовать эти элементы управления для точной настройки того, как вы хотите изменить положение дочерних элементов управления на форме или в разделе формы.

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