c# изменение - Возвращаемое значение окна WPF




размеров нестандартное (5)

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


Answers

Святая мать Марса, мне потребовалось навсегда выяснить:

ОКНО 1:

if ((bool)window.ShowDialog() == true)
{
   Window2 content = window.Content as Window2;
   string result = content.result;
   int i = 0;
}

ОКНО 2:

public partial class Window2 : UserControl
{
    public string result
    {
        get { return resultTextBox.Text; }
    }

    public Window2()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window.GetWindow(this).DialogResult = true;
        Window.GetWindow(this).Close();
    }
}

XAML:

<Button IsDefault="True" ... />

Вы можете открыть свойство во втором окне, чтобы его можно было извлечь из первого окна.

public class Window1 : Window
{
    ...

    private void btnPromptFoo_Click(object sender, RoutedEventArgs e)
    {
        var w = new Window2();
        if (w.ShowDialog() == true)
        {
            string foo = w.Foo;
            ...
        }
    }
}

public class Window2 : Window
{
    ...

    public string Foo
    {
        get { return txtFoo.Text; }
    }

}

Я знаю, что это старый, но я искал ту же информацию для приложения WPF, над которым я работаю. Я нашел этот сайт очень полезным:

http://www.dreamincode.net/forums/topic/206458-the-right-way-to-get-values-from-form1-to-form2/

Это написано для Windows Forms, но если вы проигнорируете часть о передаче значений в новое окно, она по-прежнему работает и имеет очень хорошую информацию.

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

WPF передаёт строку в новое окно


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

public DialogResult ShowDialog(out MyObject result)
{
   DialogResult dr = ShowDialog();
   result = (dr == DialogResult.Cancel) 
      ? null 
      : MyObjectInstance;
   return dr;
}

В приведенном выше примере он по-прежнему не «освобождает память сейчас». Вся память собрана мусором, но это может позволить сбор памяти в более раннем generation . Конечно, вам нужно будет выполнить некоторые тесты.

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

Я однажды прочитал код, который был простым откатом RollBack () при использовании IDisposable. Класс MiniTx, указанный ниже, будет проверять флаг на Dispose (), и если Commitвызов никогда не произошел, он будет сам называть Rollback. Он добавил слой косвенности, делающий код вызова намного понятным и поддерживающим. Результат выглядел примерно так:

using( MiniTx tx = new MiniTx() )
{
    // code that might not work.

    tx.Commit();
} 

Я также видел, что код синхронизации / ведения журнала выполняет то же самое. В этом случае метод Dispose () остановил таймер и зарегистрировал, что блок вышел.

using( LogTimer log = new LogTimer("MyCategory", "Some message") )
{
    // code to time...
}

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







c# wpf