Как изменить размер кнопки - PullRequest
1 голос
/ 10 июля 2010
int width, height;
width = this.Size.Width;
height = this.Size.Height;
width /= 3;
height /= 3;
btn_1.Size = new Size(width, height);

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

Как назначить размер кнопке?

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

Вот полный код, который работает для изменения положения объектов, но не работает для изменения размера:

private void form_counterMain_Resize(object sender, EventArgs e)
    {
        int width, height;
        Point templocation;
        templocation = new Point(0, 0);
        width = this.Size.Width;
        height = this.Size.Height;
        width /= 3;
        height /= 3;
        //:::location:::
        btn_1.Location = templocation;
        templocation.X = width;
        btn_2.Location = templocation;
        templocation.X = width * 2;
        btn_3.Location = templocation;
        templocation.X = 0;
        templocation.Y = height;
        btn_4.Location = templocation;
        templocation.X = width;
        btn_5.Location = templocation;
        templocation.X = width * 2;
        btn_6.Location = templocation;
        templocation.Y = height * 2;
        templocation.X = 0;
        btn_7.Location = templocation;
        templocation.X = width;
        btn_8.Location = templocation;
        templocation.X = width * 2;
        btn_9.Location = templocation;

        //:::size:::
        btn_1.Size = new Size(width, height);
        this.Refresh();

Ответы [ 5 ]

2 голосов
/ 11 июля 2010

что не так с настройкой свойства Alignment в соответствии с вашими потребностями?

вы также можете поместить его в панель макета таблицы 3x3, которая будет правильно закреплена / выровнена ...

let winformsразберись;)

1 голос
/ 30 июня 2015

Для тех, кто все еще ищет ответ на этот вопрос, не забудьте установить для свойства Поведение: Авторазмер кнопки значение ЛОЖЬ при попытке программно изменить ее размер.

0 голосов
/ 18 марта 2017

Из документации docs.microsoft.com для свойства Control.Size:

Поскольку класс Size является типом значения (Структура в Visual Basic, структура в VisualC #), он возвращается по значению, то есть доступ к свойству возвращает копию размера элемента управления.Таким образом, корректировка свойств Width или Height размера, возвращаемого из этого свойства, не повлияет на ширину или высоту элемента управления.Чтобы настроить ширину или высоту элемента управления, необходимо установить свойство элемента «Ширина» или «Высота» или задать для свойства «Размер» новый размер.

и

Комуподдерживать лучшую производительность, не устанавливайте размер элемента управления в его конструкторе.Предпочтительным методом является переопределение свойства DefaultSize.

0 голосов
/ 11 июля 2010

Мне не удалось выяснить, почему это не меняет его с моим кодом, пока оно работает с кодом Джейми.Но вместо того, чтобы работать над этим, я создал 9 кнопок с чистым кодом.Так что это дало мне возможность изменять каждое свойство.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace hw02
{
public partial class form_counterMain : Form
{
    int[] b=new int[9]; //initialized the counters
    Button[] btn= new Button[9]; //initialized the buttons


    public form_counterMain()
    {
        for (int t = 0; t < 9; t++) //this loop makes all the counters 0
        {
            b[t] = 0;
        }
        for (int t = 0; t < 9;t++) //this loop makes all the buttons assigned to a button
        {
            btn[t]=new Button();
        }
        InitializeComponent();
        changeFunc(); //first calculation
        btn[0].Click += new System.EventHandler(btn0Click); //here i assign the functions to buttons
        btn[1].Click += new System.EventHandler(btn1Click);
        btn[2].Click += new System.EventHandler(btn2Click);
        btn[3].Click += new System.EventHandler(btn3Click);
        btn[4].Click += new System.EventHandler(btn4Click);
        btn[5].Click += new System.EventHandler(btn5Click);
        btn[6].Click += new System.EventHandler(btn6Click);
        btn[7].Click += new System.EventHandler(btn7Click);
        btn[8].Click += new System.EventHandler(btn8Click);

    }
    private void form_counterMain_Resize(object sender, EventArgs e)
    {
        changeFunc();
    }
    private void changeFunc()
    {
        int width, height;
        Point templocation = new Point(0, 0);
        width = this.Size.Width;
        height = this.Size.Height;
        width = width/3 -5; //here i calculated the best values for 3 buttons
        height = height/3-12;
        for (int i = 0; i < 9; i++) //here i assign some necessary values to buttons and read the count numbers from memory
        {
            btn[i].Name = "btn_" + i; //the names are changed!
            btn[i].TabIndex = i;
            btn[i].Text = b[i].ToString();
            btn[i].Size = new Size(width, height);
            btn[i].Visible = true;
            btn[i].Parent = this;
            btn[i].FlatStyle = System.Windows.Forms.FlatStyle.Flat;

        }
        //this lines sets the location of the buttons
        btn[0].Location = templocation;
        templocation.X = width;
        btn[1].Location = templocation;
        templocation.X = width * 2;
        btn[2].Location = templocation;
        templocation.X = 0;
        templocation.Y = height;
        btn[3].Location = templocation;
        templocation.X = width;
        btn[4].Location = templocation;
        templocation.X = width * 2;
        btn[5].Location = templocation;
        templocation.Y = height * 2;
        templocation.X = 0;
        btn[6].Location = templocation;
        templocation.X = width;
        btn[7].Location = templocation;
        templocation.X = width * 2;
        btn[8].Location = templocation;

    }
    //here the functions start, they only increase the integers in the memory and then they force the program to refresh its visual state
    private void btn0Click(Object sender, EventArgs e)
    {
        b[0]++;
        changeFunc();
    }
    private void btn1Click(Object sender, EventArgs e)
    {
        b[1]++;
        changeFunc();
    }
    private void btn2Click(Object sender, EventArgs e)
    {
        b[2]++;
        changeFunc();
    }
    private void btn3Click(Object sender, EventArgs e)
    {
        b[3]++;
        changeFunc();
    }
    private void btn4Click(Object sender, EventArgs e)
    {
        b[4]++;
        changeFunc();
    }
    private void btn5Click(Object sender, EventArgs e)
    {
        b[5]++;
        changeFunc();
    }
    private void btn6Click(Object sender, EventArgs e)
    {
        b[6]++;
        changeFunc();
    }
    private void btn7Click(Object sender, EventArgs e)
    {
        b[7]++;
        changeFunc();
    }
    private void btn8Click(Object sender, EventArgs e)
    {
        b[8]++;
        changeFunc();
    }

}
}

Я не знаю, нужен ли кому-то код, я просто вставил.

0 голосов
/ 11 июля 2010

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

Я думаю, что вам сначала нужно лучше понять, какобработка событий работает в Windows Forms.Подробнее читайте здесь - http://msdn.microsoft.com/en-us/library/aa983610%28VS.71%29.aspx

ОБНОВЛЕНИЕ: ОК. Я вижу, что вы уже подключили обработчик событий.Я пропустил это и предположил, что вы не знали, как это сделать.

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

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