Пользовательский элемент управления не изменяется, когда окно находится в развернутом состоянии - Windows Forms C# - PullRequest
0 голосов
/ 25 марта 2020

В последнее время я работаю над этим личным приложением, его форма не имеет границ, поэтому были добавлены пользовательские кнопки «Выход», «Свернуть» и «Развернуть», а также опция изменения размера и перемещения формы. Приложение содержит несколько пользовательских элементов управления, которые выполняют различные функции, такие как вход в систему, панель управления для приложения и так далее. Проблема здесь заключается в том, что пользовательские элементы управления , которые размещены на панели (конечно, привязаны должным образом) в основной форме, не изменяют размеры должным образом, когда окно находится в Максимальное состояние.

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

Сначала я подумал, что это может иметь какое-то отношение к коду, который изменяет размеры формы, поэтому я удалил все и сделал приложение со стандартными windows границей и элементами управления, в основном установив свойство border из нет до значительный но это ничего не сделало. Также я попытался получить доступ к родительскому элементу пользовательского элемента управления (панели) с помощью this.Parent, а затем установить ширину и высоту элемента управления с помощью Width = this.Parent.Width и Height = this.Parent.Height, но родитель возвращает null по какой-то причине, которую мне еще предстоит Понимаю. Теперь стоит упомянуть, что эти пользовательские элементы управления динамически добавляются (например, Login loginForm = new Login();) на панель при каждом нажатии кнопки, а затем Disposed после того, как элемент управления оставлен.

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

Спасибо, ожидаемо.

1 Ответ

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

Между тем, для Winforms у меня может быть ответ .. ключ должен использовать событие Resize вашего пользовательского элемента управления, см. Ниже. Я протестировал это в Core 3.1 и Net 4.7, вы можете использовать модуль по умолчанию designer.cs с пустой формой. У него нет проблем с изменением размера из развернутого состояния.

Мой пользовательский элемент управления для центрального приложения называется CenteredPanel и является производным от Panel. убедитесь, что вы извлекаете свои пользовательские элементы управления из Panel и вызываете base () для конструктора, иначе стыковка не будет работать должным образом.

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

   public partial class Form1 : Form
    {
        private Panel panel1, panel2, panel3, panel4;
        private CenteredPanel panelApp;

        public Form1()
        {
            InitializeComponent();
            this.panel1 = new System.Windows.Forms.Panel()
              { Parent = this, Dock = DockStyle.Fill };
            this.panel2 = new System.Windows.Forms.Panel()
              { Parent = panel1, Dock = DockStyle.Left, Width = 120, BackColor = Color.FromArgb(60, 60, 60) };
            this.panel3 = new System.Windows.Forms.Panel()
              { Parent = panel1, Dock = DockStyle.Fill };
            this.panel4 = new System.Windows.Forms.Panel()
              { Parent = panel3, Dock = DockStyle.Top, Height = 60, BackColor = Color.FromArgb(60, 60, 60) };
            this.panelApp = new WindowsFormsAppCore.CenteredPanel()
              { Parent = panel3, Dock = DockStyle.Fill, BackColor = Color.FromArgb(90, 90, 90) };
            this.panel1.Controls.Add(this.panel3);
            this.panel1.Controls.Add(this.panel2);
            this.panel3.Controls.Add(this.panelApp);
            this.panel3.Controls.Add(this.panel4);
            this.Controls.Add(this.panel1);
        }
    }

    public class CenteredPanel : Panel
    {
        Label label1, label2;
        TextBox textbox1;

        public CenteredPanel() : base()
        {
            this.Resize += new System.EventHandler(this.Resizer);
            this.label1 = new System.Windows.Forms.Label()
              { Parent = this, AutoSize = true, Name = "label1", ForeColor =Color.White, Text = "Connectare Administrator" };
            this.label2 = new System.Windows.Forms.Label()
              { Parent = this, AutoSize = true, Name = "label2", ForeColor = Color.White, Text = "Nume de utilizator" };
            this.textbox1 = new System.Windows.Forms.TextBox()
              { Parent = this, AutoSize = true, Name = "textbox1", PasswordChar = '*', Text = "****" };
            this.Controls.Add(this.label1);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.textbox1);
        }

        public void Resizer(object sender, EventArgs e)
        {
            Point CenteringAnchor = new Point(Width / 2, Height / 2);
            for (int i=0; i<Controls.Count; i++)
            {
                Control c = Controls[i];
                // put your resizing rules here.. this is a very simple one
                c.Location = new Point(CenteringAnchor.X - c.Width / 2, -40 + i * ((i == 1) ? 40 : 30) + CenteringAnchor.Y - c.Height / 2);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...