Откройте новое окно, но не всегда новый его экземпляр - PullRequest
3 голосов
/ 12 января 2012

Я все еще на стадии изучения c #, поэтому не стреляйте в меня, если вы считаете это глупым вопросом; -)

В проекте у меня есть главное окно и новое окно с именем "window1"

На главном я делаю кнопку, которая пойдет в окно1 вот так:

private void Button_Click(object sender, RoutedEventArgs e)
{

    Window1 W1 = new Window1();
    W1.Show();
    this.Close();

}

Теперь это работает, как и ожидалось, создает новый экземпляр window1 и показывает его при закрытии главного окна.

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

Также я сделал кнопку «Назад» в window1, которая использует тот же код, что и выше, чтобы вернуться в главное окно (теперь новое окно1, но новое главное окно)

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

Но как мне это сделать, если я хочу снова открыть тот первый экземпляр window1, который уже был изменен пользователем?

Сначала я подумал о размещении Window1 W1 = new Window1(); вне метода кнопки, но это также не сработает из-за этой кнопки «назад».

Надеюсь, я достаточно хорошо объяснил, что я пытаюсь сделать.

Есть мысли по этому поводу?

=====================

РЕДАКТИРОВАТЬ 1:

используя пример кода из "chrfin" некоторые ошибки genarate частей, такие как "visible = true" часть Может быть, это потому, что я использую Express 2010 или потому, что я использую WPF, а не формы?

в основном:

Window1 W1 = null; // Initialise Field.  

private void CalcTabel_Click(object sender, RoutedEventArgs e)
{

    if (W1 == null)
    {
        W1 = new Window1();
        W1.MainWindow = this; //ERROR 
        W1.Show();
    }
    else
        W1.Visibility = Visibility.Visible;
    this.Visibility = Visibility.Hidden;
}

в окне1

public MainWindow w1 { get; set; }

private void Quit_Click(object sender, RoutedEventArgs e)
{
    w1.Visibility = Visibility.Visible;
    this.Visibility = Visibility.Hidden;

}

теперь ошибка, которую я получаю в основной части: «WpfApplication1.Window1» не содержит определения для «MainWindow», принимающего первый аргумент типа «WpfApplication1.Window1» (вы пропустили директиву using или ссылку на сборку?)

просто удаление этой строки ошибки приведет к тому, что get, set part ничего не получит.

есть идеи?

=====================

РЕДАКТИРОВАТЬ 1:

Спасибо еще раз "chrfin" получил это работает сейчас:)

в основном:

Window1 W1 = null; // Initialise Field.  

private void CalcTabel_Click(object sender, RoutedEventArgs e)
{

    if (W1 == null)
    {
        W1 = new Window1();
        W1.Hoofdmenu = this;
        W1.Show();
    }
    else
        W1.Visibility = Visibility.Visible;
    this.Visibility = Visibility.Hidden;
}

в Window1:

public MainWindow Hoofdmenu { get; set; }

private void Quit_Click(object sender, RoutedEventArgs e)
{

    Hoofdmenu.Visibility = Visibility.Visible;
    this.Visibility = Visibility.Hidden;

}
  • Решено -

Ответы [ 5 ]

2 голосов
/ 12 января 2012

Вы можете сделать что-то вроде этого:

Window1 w1 = null;

private void Button_Click(object sender, RoutedEventArgs e)
{
    if(w1 == null)
    {
        w1 = new Window1();
        w1.MainWindow = this; //create this property - see below
        w1.Show();
    }
    else
        w1.Visible = true;

    this.Visible = false;
}

и внутри Window1:

public MainWindow MainWindow { get; set; }    

private void ButtonBack_Click(object sender, RoutedEventArgs e)
{
    this.Visible = false;
    MainWindow.Visible = true;
}
1 голос
/ 12 января 2012

Есть много способов достижения желаемого результата.Метод, который я использовал бы ниже:

Window1 W1 = null; // Initialise Field. 

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (W1 == null) W1 = new Window1();
    W1.Show();
    this.Close();
}
0 голосов
/ 12 января 2012

Создайте статическое свойство для хранения в нем ссылки на W1 и в методе Button_Click проверьте, имеет ли оно какое-либо значение, в противном случае создайте новое;

Другой вариант - посмотреть на открытые окна вобъект приложения доступен через Application.Current.Windows.

0 голосов
/ 12 января 2012

Ну, здесь может быть более одного решения.

1) Вы можете сохранить изменения, сделанные пользователем в Windows1. Всякий раз, когда вы перезапускаете Window1, передайте ему настройку или предыдущие изменения, чтобы Window1 мог перенастроить себя в соответствии с последним состоянием

2) Вместо того, чтобы всегда создавать новый экземпляр Window1 и закрывать его на кнопке назад, просто используйте show и hide, чтобы сделать window1 видимым и невидимым для пользователя

0 голосов
/ 12 января 2012

Вы также можете отменить мероприятие.

...