2017-09-07 20 views
-1

私はメインウィンドウを持っており、ボタンがあります。メインウィンドウのボタンを押すと、サブウィンドウが開きます。サブウィンドウにはテキストボックスがあり、サブウィンドウでテキストを入力して追加ボタンをクリックすると、テキストがメインウィンドウに表示されます。これをどのように達成するのですか?前もって感謝します。WPFは1つのウィンドウから別のウィンドウにテキストを渡します

+0

質問はなぜこれが必要ですか?これはちょうどこのような1つの呼び出しで小さなアプリケーションですか?あるいはこれらの数十が必要になりますか?窓が2つしかありませんか? – sTrenat

+0

私は多くのサブウィンドウを持っていますが、この問題が残っています。すべてのウィンドウがこのウィンドウでのみ動作しています。サブウィンドウからメインウィンドウにテキストが表示されません。 –

+0

汚い方法:mainWindowへの参照をコンストラクタまたは他のメソッドで渡して、MainWindowをApplication.Current(...)で取得する静的プロパティです。それほど悪くない:IoC、コンテナからウィンドウを取得する。いいえ:EventAggregator/listener/observer/mediator/messenger oop – sTrenat

答えて

1

MainWindowクラスのパラメータ化されたコンストラクタを作成し、サブウィンドウからメインウィンドウにTextboxの値を渡し、MainWindowでそのラベルに内容を設定できます。 がここに実装したものです MainWindow.xmal.csここ

public partial class MainWindow : Window 
    { 
    public MainWindow() 
     { 
     InitializeComponent(); 
     } 
    public MainWindow (string text) : this() 
    { 
     label.Content = text; 

    } 
    private void button_Click (object sender, RoutedEventArgs e) 
     { 
     Window1 win1 = new Window1(); 
     win1.Show(); 
     this.Close(); 
     } 
    } 

サブウィンドウすなわちWindow1.xaml.cs

public partial class Window1 : Window 
    { 
    private string text; 
    public Window1() 
     { 
     InitializeComponent(); 
     } 

    private void button_Click (object sender, RoutedEventArgs e) 
     { 
     text = textBox.Text; 
     MainWindow mainWindow = new MainWindow(text); 
     mainWindow.Show(); 
     this.Close(); 
     } 
    } 
+0

これは分離の原則に反する – Mafii

+0

ここです私のアプリケーションで試しているサンプルコード –

+0

メインウィンドウXAMLファイル –

0

あなたは単に秒のコンストラクタを変更することができるためのコードですウィンドウ:

public partial class Window1 : Window 
    { 
    string text; 
    public Window1 (string _text) 
    { 
    InitializeComponent(); 
    this.text = _text; 
    } 
    } 
0

MainWindowがそれをインスタンス化するときにサブスクライブできる 'ダイアログ'サブウィンドウへのイベント。

ダイアログウィンドウ:(サブウィンドウ):

public class DialogInputEventArgs : EventArgs 
{ 
    public string Input { get; set; } 
} 

public partial class DialogWindow : Window 
{ 
    public event EventHandler<DialogInputEventArgs> InputChanged = delegate { }; 

    private void SubmitInputButton_Click(object sender, RoutedEventArgs e) 
    { 
     InputChanged(this, new DialogInputEventArgs() { Input = this._inputTextBox.Text }); 
    } 
} 

は、メインウィンドウ:

private void ShowDialogButton_Click(object sender, RoutedEventArgs e) 
{ 
    DialogWindow dw = new DialogWindow(); 
    dw.InputChanged += OnDialogInputChanged; 
    dw.Show(); 
} 

private void OnDialogInputChanged(object sender, DialogInputEventArgs e) 
{ 
    // update the MainWindow somehow using e.Input (the text submitted in dialog) 
} 

あなたが複数のウィンドウのために、このメカニズムが必要な場合は、私がmessagebusのように、より汎用的なものとなるだろうかオブザーバーパターンのこと。

0

私はCaliburnMicroのframweworkを使用して、コントロール間のより簡単でより良いコミュニケーションを実現することをお勧めします(MVVMパターンを使用していると仮定します)。 CaliburnMicroのすべての機能を実装する必要はなく、コントロール間のメッセージの送受信を管理するためのEventAggregatorだけです。

関連する問題