Увеличение с помощью двух форм

У меня есть несколько форм в моем проекте. Form1 содержит pictureBox, который отображает jpeg. В Form2 у меня есть trackBar, которым я хотел бы управлять уровнем масштабирования изображения в Form1. Для простоты мне нужно всего 2 или 3 уровня масштабирования. Я сделал pictureBox общедоступным в представлении Designer. Однако, когда я пытаюсь сослаться на pictureBox в Form2, он говорит, что его не существует. Ниже приведен код, который я использую для вызова Form2 в Form1.

Form2 dataWindow = new Form2();
dataWindow.ShowDialog();

Короче говоря, мне нужна помощь в двух вещах:

1) Изменение свойств pictureBox1 из отдельной формы. 2) Создание простой формулы масштабирования.


person Trevor Thompson    schedule 24.11.2012    source источник
comment
У @Servy есть лучший совет, я отредактировал свой ответ, включив в него полную реализацию для вашего удобства. Просто добавьте PictureBox и Button в form1 и TrackBar в form2 и вставьте код.   -  person Jeremy Thompson    schedule 24.11.2012


Ответы (2)


1) Передайте ссылку form1 в конструктор form2:

Form2 dataWindow = new Form2(this);
dataWindow.Show();

...

private form1 as Form1;
public Form2(Form1 frm1)
{
  form1 = frm1;
}

Затем в событии Form2s TrackBar_Scroll ссылайтесь на PictureBox через закрытую переменную-член form1: form1.PictureBox1.Property

2) Увеличивайте изображения с помощью PictureBox, чтобы их можно было масштабировать. колесиком мыши


Лучший способ - это события:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.TrackBarMoved += new Action<int>(ZoomPictureBox);
        form2.ShowDialog();
        form2.TrackBarMoved -= new Action<int>(ZoomPictureBox);

    }

    private void ZoomPictureBox(int zoomFactor)
    {
        pictureBox1.Width = 100 * zoomFactor;
        pictureBox1.Height = 100 * zoomFactor;
    }
}


public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public event Action<int> TrackBarMoved;

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        TrackBarMoved(trackBar1.Value);
    }
}
person Jeremy Thompson    schedule 24.11.2012
comment
Обычно считается плохой практикой передавать ссылку родительской формы в дочернюю форму. - person Servy; 24.11.2012
comment
Спасибо, авторы. Я опробовал части примера кода. Вопрос... кажется, есть два действия: одно перед диалоговым окном "Показать" и одно после. Я попробовал код только с новым действием +=, и он имеет тот же эффект, что и код без второго действия -=. Что такое предполагаемая цель второго действия? - person Trevor Thompson; 24.11.2012
comment
Когда вы подписываетесь на обработчик событий +=, вам нужно отказаться от подписки -=, когда вы закончите. В противном случае это может привести к утечке памяти. - person Jeremy Thompson; 24.11.2012
comment
Еще раз спасибо вам обоим. Код работает отлично. Теперь я создаю несколько полос прокрутки во второй форме, используя ту же концепцию. небольшое знание этого языка, кажется, имеет большое значение. - person Trevor Thompson; 24.11.2012

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

Надлежащий способ решения этой проблемы — через события. Дочерняя форма Form2 должна определять публичное событие:

public event Action<int> TrackBarMoved;

Form2 может запускать это событие при перемещении полосы дорожки и передавать в качестве параметра положение полосы дорожки (если имеет смысл передать что-то еще, например уровень масштабирования или что-то еще, что вы хотите, это тоже нормально).

Form1 может подписаться на это событие при создании From2 и изменить масштаб изображения (внутри, изнутри Form1) в зависимости от положения трекбара.

person Servy    schedule 24.11.2012