WPF中忙碌时的消息框

3
我应该如何在应用程序在后台繁忙时显示消息框或其他类似通知,类似于这个模型:enter image description here

你的意思是类似于沙漏一样的等待通知吗? - Shamim Hafiz - MSFT
可能是Is there a WPF message box?的重复问题。或者你可以创建自己的窗口... - Cody Gray
1
@CodyGray:我认为这不是原帖作者想要表达的,更多的是在UI上处理完成时显示等待图标。 - Shamim Hafiz - MSFT
我同意。这并不是要求使用 Messagebox.Show() - Isak Savo
@murmansk:我稍微编辑了一下你的问题,以符合我认为你所要求的内容。如果我误解了你,请告诉我。 - Isak Savo
@IsakSavo 实际上我正在点击一个按钮,它会在等待时进行一些处理,同时显示这个对话框,其中图片是“等待圆圈”。它会在我点击按钮后立即出现。我对WPF还很陌生。 - murmansk
2个回答

8

WPF Extended Toolkit 中有一个繁忙指示器,我经常使用它:

繁忙指示器截图

该工具包可以通过NuGet方便地添加到您的项目中作为引用。 我个人在近期的所有WPF项目中都使用了它(以及该工具包中的许多其他有用控件)。

要使用它,请在XAML代码中将您的控件与繁忙指示器一起包围:

<extToolkit:BusyIndicator ...>
    <Grid>
        <Button Content="Click to do stuff" />
        <!-- your other stuff here -->
    </Grid>
</extToolkit:BusyIndicator>       

当你想要弹出窗口时,只需将IsBusy属性设置为true,并在应该隐藏时设置为false。在适当的MVVM架构中,通常会将属性在XAML中数据绑定到视图模型中的属性,然后相应地设置为true/false:

<extToolkit:BusyIndicator IsBusy="{Binding IsBusy}" >

但如果你没有使用MVVM,你可以在代码中手动设置它,通常在按钮单击处理程序中:

给控件命名以便在代码中引用:

<extToolkit:BusyIndicator x:Name="busyIndicator" >

然后,在您的xaml.cs文件中:
void myButton_Click(object sender, RoutedEventArgs e)
{
    busyIndicator.IsBusy = true;
    // Start your background work - this has to be done on a separate thread,
    // for example by using a BackgroundWorker
    var worker = new BackgroundWorker();
    worker.DoWork += (s,ev) => DoSomeWork();
    worker.RunWorkerCompleted += (s,ev) => busyIndicator.IsBusy = false;
    worker.RunWorkerAsync();
}

4
如果您使用MVVM,那么很容易实现:
1.) 在您的ViewModel中添加一个布尔标志“IsBusy”,并进行更改通知。
public bool IsBusy {get {return _isBusy;} set{_isBusy=value;OnPropertyChanged("IsBusy");}}
private bool _isBusy;

2.) 在您的命令中添加两个事件“Started”和“Completed”

public event Action Completed;

public event Action Started;

3.) 在您的ViewModel中订阅这些事件并设置繁忙状态。

LoadImagesCommand.Started += delegate { IsBusy = true; };
LoadImagesCommand.Completed += delegate { IsBusy = false; };

4.) 在您的窗口中,现在可以绑定到该状态。

<Popup Visibility="{Binding Path=IsBusy,Converter={StaticResource boolToVisibilityConverter}}"/>

请注意,对于最后一步,您必须实例化boolToVisibilityConverter,如下所示:

5.) 将以下内容添加到任何已加载的资源字典中:

<BooleanToVisibilityConverter x:Key="boolToVisibilityConverter"/>

就是这样了!您可以填充您想要的生活到弹出窗口中...


如果您不使用MVVM,也很容易;这与MVVM无关。您可以像使用MVVM一样做任何事情,只是最终变得不那么易于维护。 - H.B.
我觉得这个 MVVM 的东西没法进入我的大脑,我对 WPF 还很新,有没有什么简单的方法只使用 .caml 和 .xaml.cs 文件? - murmansk
使用xaml.cs,您可以做到这一点。只是这会使您的UI状态有点更多,但基本上您可以在XAML中定义一个弹出窗口,然后使用Popup.Visibility = Visibility.Hidden / Visible来隐藏或显示您的弹出窗口。 - Sebastian Edelmeier
@murmansk: .caml?无论如何,希望你知道你必须在后台线程上完成工作,并且只能通过UI线程的Dispatcher访问UI元素。要小心,否则你会回来问“为什么我的忙指示器没有显示”(因为你正在UI线程中工作,所以UI不会更新)和“为什么在更新UI时出现异常”(因为你正在从另一个线程触摸UI组件)。 - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接