将数据从子窗口传递到主窗口 TextBlock

2023-12-22

在这个例子中,MainWindow有一个打开的按钮Window2.

Window2有一个按钮写着“Hello, World!”到MainWindow文本块。

项目来源:https://www.dropbox.com/s/jegeguhycs1mewu/PassData.zip?dl=0 https://www.dropbox.com/s/jegeguhycs1mewu/PassData.zip?dl=0


从以下位置传递数据的正确方法是什么Window2 to MainWindow?

private MainWindow mainwindow;
public MainWindow mainwindow { get; private set; }
public Window MainWindow { get; set; }
private object mainwindow { get; private set; };
private MainWindow mainwindow = ((MainWindow)System.Windows.Application.Current.MainWindow);

this.mainwindow = mainwindow;

主窗口

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    // Open Window 2
    private void buttonWindow2_Click(object sender, RoutedEventArgs e)
    {
        Window2 window2 = new Window2(this);
        window2.Left = Math.Max(this.Left - window2.Width, 0);
        window2.Top = Math.Max(this.Top - 0, 0);
        window2.ShowDialog();
    }
}

Window 2

public partial class Window2 : Window
{
    private MainWindow mainwindow;

    public Window2(MainWindow mainwindow)
    {
        InitializeComponent();

        this.mainwindow = mainwindow;
    }

    // Write Message to MainWindow
    private void buttonMessage_Click(object sender, RoutedEventArgs e)
    {
        mainwindow.textBlockMessage.Text = "Hello, world!";
    }
}

“正确”的方式通常取决于您的需求和情况。但一般来说,使用委托在窗口之间传递数据是一种常见且标准的做法。

假设您要传递的数据是一个字符串。在主窗口中,您想要创建一个委托来传递字符串。然后,您创建该委托类型的实例并订阅匹配的方法。然后,当您打开辅助窗口时,将该委托传递给辅助窗口。

public delegate void DataTransfer(string data);

public partial class MainWindow : Window
{
    public DataTransfer transferDelegate;

    public MainWindow()
    {
        InitializeComponent();
        transferDelegate += new DataTransfer(DataMethod);
    }

    public void DataMethod(string data)
    {
        // Do what you want with your data.
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Window2 win = new Window2(transferDelegate);
        win.Show();
    }
}

现在,当您在辅助窗口中调用该委托时,DataMethod()您的 Form1 的 被调用,因此您可以在窗口之间传递信息。

您的辅助窗口实现应如下所示:

public partial class Window2 : Window
{
    DataTransfer transferDel;

    public Window2(DataTransfer del)
    {
        InitializeComponent();
        transferDel = del;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string data = "Hello, World!"; // Your string data to pass.
        transferDel.Invoke(data);
    }
}

正如您所看到的,当您调用传递的委托时,它会调用主程序中相应的方法。

此方法的一个突出优点是您不需要将 MainWindow 实例传递给 Window2,只需使用委托和订阅方法在两个窗口实例之间传递数据即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据从子窗口传递到主窗口 TextBlock 的相关文章

  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • log4net 控制台应用程序未登录发布

    我有一个使用 log4net 的控制台应用程序 通过温莎城堡 当我调试时 一切都很好地记录到控制台 但是当我发布并运行应用程序时 没有记录任何内容 我的 log4net 配置位于单独的文件 log4net config 中 我认为它没有找到
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • xamarin intellisense 无法在 Windows 10 上的 Visual Studio 2015 中工作

    我一直在尝试在 Windows 10 平台上将 Xamarin 与 Visual Studio 2015 一起使用 我无法对 XML 使用 Intellisense 这非常令人沮丧 有什么解决办法吗 您需要将 android 布局文件的 x
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐