【问题标题】:Effect not correctly drawn效果未正确绘制
【发布时间】:2018-05-01 10:12:39
【问题描述】:

我们目前正在使用 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) 替换对话框,则看不到模糊。

我的问题是如何正确处理这种方法?

【问题讨论】:

  • 您应该使用数据触发器来应用效果并绑定到 bool 而不是 ui 组件。

标签: c# wpf mvvm


【解决方案1】:

在你的 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:

  1. 在窗口初始化期间(在构造函数或 Loaded 事件处理程序中),将 IsBlur=true 设置为开头。
  2. 在您的 [retrieve data from server] 方法中,您需要将此作为异步任务,当它完成时,它应该更新 IsBlur=false。

关于多长时间,这取决于[从服务器检索数据]需要多长时间才能完成。我不认为这是你应该推迟的事情。如果您确实需要延迟,那么只需在 [retrieve data from server] 上设置延迟即可。

【讨论】:

  • 谢谢你的例子。但我无法让它工作。模糊效果仅在我显示 UserControl 时显示。在显示另一个 UserControl 之前进行了一些延迟测试。
  • 对不起,如果我没有给出您需要的答案。我刚刚更新了答案,并给了你如何解决的想法。因为,我不认为我可以用你提供的有限信息来解决这个问题。
  • 新评论,因为最后一条无法再编辑了:希望这会让事情变得更清楚:[从服务器检索数据]在我的原始帖子中确实需要一些时间(大约 2-5 秒)并且BlurEffect 仅在执行 [create & show tool window] 部分时生效。因此,我有一个无法摆脱的延迟。为了测试这一点,我使用了一些 Thread.Sleep() 因为我一直没有连接到服务器。我的问题是如何摆脱从 IsBlur=true 到 [create & show tool window] 的显示延迟?
猜你喜欢
  • 2013-02-25
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2011-03-11
  • 2017-10-02
  • 2011-09-07
相关资源
最近更新 更多