【问题标题】:WPF passing text from one window to another windowWPF将文本从一个窗口传递到另一个窗口
【发布时间】:2017-09-07 06:12:17
【问题描述】:

我有一个主窗口,它有一个按钮。当我按下主窗口按钮时,它将打开子窗口。在子窗口中,我有一个文本框,当我输入文本并单击子窗口中的添加按钮时,文本应显示在主窗口上。我如何实现这一目标?提前致谢。

【问题讨论】:

  • 问题是你为什么需要这个?像这样只有一个电话的小应用程序吗?或者你需要几十个吗?你会只有两个窗口吗?
  • 它是一个应用程序,我有很多子窗口,但我遇到了这个问题,其余所有窗口都工作正常。只有这个窗口我没有从子窗口到主窗口的文本窗口。
  • 肮脏的方式:静态属性,通过构造函数或任何其他方法传递对 mainWindow 的引用,通过 Application.Current.(...) 获取 MainWindow。还不错:IoC,并从容器中获取窗口。好:EventAggregator/listener/observer/mediator/messenger oop
  • 或者在子窗口中创建事件,从窗口订阅,然后用按钮触发
  • 我在子窗口中创建了一个事件,但无法使用该按钮将其带到主窗口

标签: c# wpf


【解决方案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();
        }
    }

这是 subWindow 的代码,即 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();
        }
    }

【讨论】:

  • 这违反了分离原则
  • 这是我在我的应用程序中尝试的示例代码
  • 主窗口 XAML 文件
  • 您也可以在 Window1 类 mainWindow.label.Content = textBox.Text 的 button_Click 事件中尝试这样做;
  • 我尝试了您的方法,但仍然无法在主窗口中获取文本。
【解决方案2】:

你可以简单地修改第二个窗口的构造函数:

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

【讨论】:

    【解决方案3】:

    我会在您的“对话框”子窗口中添加一个事件,MainWindow 在实例化它时可以订阅该事件。

    DialogWindow:(子窗口):

    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)
    }
    

    如果您需要这种机制用于多个窗口,我会选择更通用的东西,比如消息总线或观察者模式。

    【讨论】:

      【解决方案4】:

      我建议您使用 CaliburnMicro 框架来实现控件之间的更轻松和更好的通信(假设您使用的是 MVVM 模式)。您不必实现 CaliburnMicro 的所有功能,只需使用 EventAggregator 来管理控件之间的消息发送和处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多