【问题标题】:C# How to get loading status of one window in another window?C#如何在另一个窗口中获取一个窗口的加载状态?
【发布时间】:2021-03-09 14:21:13
【问题描述】:

我正在用 c# 在 wpf 中编写一个包含两个窗口的程序。一个名为MainWindow,另一个名为SubWindow

MainWindow 包含一个按钮和一个文本块。单击按钮时,会显示子窗口。

SubWindow 包含从磁盘上的图像和视频文件嵌入到其中的多个图像和视频 (MediaElement)。因此,当子窗口加载时,它也会从磁盘加载图像和视频。这需要一段时间。 所以我希望用户知道当前在 SubWindow 中加载的图像和视频文件的文件名。我想通过在 MainWindow 的文本块中显示正在加载的文件名来实现这一点。总而言之,当单击 MainWindow 上的按钮时,会加载子窗口,并且 MainWindow 中的文本块会显示子窗口中当前正在加载的文件的文件名,并且一旦加载了所有文件,文本块就会显示消息“所有文件已成功加载”。我如何做到这一点?

【问题讨论】:

  • 已经有manyquestions关于如何在WPF组件之间传递数据。 Use events;在类之间传递 UI 组件是很成问题的。

标签: c# .net wpf window


【解决方案1】:

您可以使用事件。

要注册一个新事件,请将下面的代码放在您的子窗口顶部

        [Browsable(true)]
        [Category("Action")]
        public event EventHandler<string> MyFilesLoaded;

当您的代码加载文件时,会引发这样的事件。您可以多次发起活动。

  string f = "abc.doc,123.xls";
  EventHandler<string> handler = MyFilesLoaded;
  handler?.Invoke(null, f);

当然,你可以传递一个列表来代替字符串。

在你的主窗口注册事件:

public MainWindow()
{
    SubWindow.MyFilesLoaded+= DoSomething;
}

并在触发时处理事件:

private void DoSomething(object sender, string files)
{
     mynicetxt.Text = files;
}

【讨论】:

    【解决方案2】:

    将主窗口传递给子窗口构造函数,这使您可以访问主窗口上的所有元素。包括您已写入的任何方法,例如更新文本框。

    我还认为有一个“父”属性可以遍历回来找到主窗口?不过我记不太清楚了,如果是这样的话?

    【讨论】:

    • 但是我怎么知道当前正在加载什么文件呢?
    • 你的子窗口肯定知道它在哪个文件?做加载的方法,知道它在做什么吗?对于一个很好的整洁的实现,您可以使用观察者模式,但是这可能有点矫枉过正?
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多