我们目前正在使用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),则不会看到模糊。
我的问题是如何正确处理这种方法?
答案 0 :(得分:0)
在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
========更新==========
所以,我猜你在问什么时候应该打开/关闭模糊效果。通常,您应该在两个不同的位置设置BlurEffect:
关于多长时间,它取决于[从服务器检索数据]完成的时间。我不认为这是你应该推迟的事情。如果你真的需要延迟,那么只需将延迟放在[从服务器检索数据]上。