c# - 效果未正确绘制
问题描述
我们目前正在使用 wpf 和 mvvm 开发桌面应用程序。我们需要显示工具窗口和其他对话框。为了将用户注意力集中在活动窗口上,主应用程序使用模糊效果(属性绑定到 ViewModel)进行了模糊处理。
这是一个非常基本的实现草案:
MainWindow.xaml:
<Window
...
Effect={Binding WindowEffect}
>
<Window.DataContext>
<viewmodels:MainWindowViewModel />
</Window.DataContext>
[... Content...]
</Window>
MainWindowViewModel.cs:
SomeMethod() {
WindowEffect = new BlurEffect();
...
[retrieve data from server]
...
[create & show tool window]
...
WindowEffect = null;
}
这种方法基本可行,但存在一些问题。我知道它不能正确地满足 mvvm 模式,因为我们是通过 ViewModel 直接控制 UI。实际问题是 BlurEffect 仅在显示工具窗口时生效。我们知道,因为从服务器检索数据确实需要几秒钟......此外,如果显示工具窗口,则 BlurEffect 仅可见。如果我们用一些延迟(Task.Delay)替换对话框,则看不到模糊。
我的问题是如何正确处理这种方法?
解决方案
在你的 VM 中创建一个 bool 属性:
// I am using Prism.Mvvm.BindableBase
public bool IsBlur
{
get {return _isBlur;}
set {SetProperty(ref _isBlur, value);}
}
在您的 Xaml 中,
<Window ....> <!--remove the Effect-->
<Window.Style>
<Style TargetType="{x:Type Window}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsBlur, Mode=OneWay}" Value="True">
<Setter Property="Effect">
<Setter.Value>
<BlurEffect .../> <!-- set some property here as necessary -->
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Style>
所以,你需要做的是
IsBlur = true; // to turn on the blur effect
// or
IsBlur = false; // to turn off the blur effect
======== 更新 ==========
所以,我猜你在问什么时候应该打开/关闭模糊效果。通常,您应该在 2 个不同的地方设置 BlurEffect:
- 在窗口初始化期间(在构造函数或 Loaded 事件处理程序中),将 IsBlur=true 设置为开头。
- 在您的 [retrieve data from server] 方法中,您需要将此作为异步任务,当它完成时,它应该更新 IsBlur=false。
关于多长时间,这取决于[从服务器检索数据]需要多长时间才能完成。我不认为这是你应该推迟的事情。如果你真的需要延迟,那么只需在 [retrieve data from server] 上设置延迟即可。
推荐阅读
- gnuplot - 在 Gnuplot 中循环统计名称
- c++ - 使用 Boost Logging 和 ERROR 优先级 3 到 syslog 数据库时出现问题
- sql - ORACLE one hot encoding:对所有可用列使用 PIVOT 运算符
- reactjs - React IonSlide 左右导航不起作用
- amazon-web-services - AWS - 将小 .yml 文件存储为 SSM 参数很热?
- visual-studio - Visual Studio 项目中的图标是什么意思?
- python - 通过 python scrapy 包获取响应
- macos - 带有 rabbitmq-server 命令的 RabbitMq 未运行
- c# - 打开推送通知时的路由
- python - 返回字符串中包含长度字符的单词数