WPF快速通知控件

时间:2014-03-20 10:54:33

标签: c# wpf mvvm alert

使用MVVM开发WPF应用程序,我已经达到了我已经得到了一个" save"可编辑数据网格上的按钮,用于幕后处理,但实际上并未更新UI中的任何内容,因此用户无法知道保存是否成功。

我对WPF很陌生,我认为会有一个简单的Flash消息控件,可以用来通知用户成功,然后在没有他们必须做任何事情的情况下逐渐消失。但似乎香草WPF中没有任何东西可以做到这一点,而且似乎也没有很多自定义解决方案。

我不想使用任何类型的消息框,因为它会强制用户采取措施来解除警报 - 我需要一些能够在不干扰其工作流程的情况下快速闪烁消息的内容。我之后有点像JavaScript Toastr库 -

http://codeseven.github.io/toastr/demo.html

任何人都可以指出我现有的控制权,或者我可能会从哪一处开始构建一个?

4 个答案:

答案 0 :(得分:2)

我认为您不需要任何第三方控件。您始终可以创建自定义控件,将其粘贴到布局中,并将布局可见性属性绑定到视图模型。另一种选择是使用 StatusBar 来通知Word或VisualStudio中的客户端。有一个简短的例子:

xaml中的某个地方:

// ..
<StatusBar DockPanel.Dock="Bottom">
    <StatusBarItem>
        <Label Content="{Binding Message}"></Label>
    </StatusBarItem>
</StatusBar>
// ..

代码中的某处(我喜欢在WPF中使用async / await):

// ..
statusBarViewModel.Message = "Processing the file..."; // assumed that you bind this view model to the view
await DoWork(); // do much work
await statusBarViewModel.ShowMessageAndHide("File saved"); // show final message and hide it after some time
// ..

StatusBarViewModel

public class StatusBarViewModel : INotifyPropertyChanged
{

    private string message = string.Empty;

    public string Message
    {
        get { return message; }
        set
        {
            if (value == message) return;
            message = value;
            OnPropertyChanged();
        }
    }

    public async Task ShowMessageAndHide(string message)
    {
        Message = message;
        await Task.Delay(5000);
        Message = string.Empty;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

}

答案 1 :(得分:1)

我在WPF中执行关于处理结束的简单通知的方法是显示工具提示。您可以从代码中打开工具提示:

https://stackoverflow.com/a/1911721/3391743

ToolTip tooltip = new ToolTip{ Content = "My Tooltip" };
NameTextBox.ToolTip = tooltip;
tooltip.IsOpen = true;

然后你可以像这里一样使用计时器: https://stackoverflow.com/a/1091753/3391743

对于IImplementPropertyChanged,在Fody Property Changed程序集中有一个很好的属性[PropertyChanged]可以通过NuGet获得,它可以为你完成所有的管道工作。

在此查看有关Fody的参考:https://github.com/Fody/PropertyChanged

答案 2 :(得分:0)

您可以使用&#34; NotifyIcon&#34;来自hardcodet以在WPF中实现类似Toast的通知。

另外,为了让您的UI更新,绑定引擎需要知道什么时候发生了变化。在.NET中,INotifyPropertyChanged界面用于此目的,您需要在更改时在UI中更新的成员上实现该目标。

Here is a SO post which covers how to implement it.

答案 3 :(得分:0)

您要问的是几个部分:

  • 要拥有“幕后”执行的代码,听起来好像是在询问异步编程。见async/await
  • 要拥有可与视图模型交互的自定义​​视觉效果,您应该查看Microsoft Prism的IInteractionRequest实现。

这是一个很好的example代码项目文章,讨论如何使用Microsoft Prism框架执行此操作,但是如果您不使用该框架,则可以调整代码以适合您。