Эффект не правильно нарисован - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время мы работаем над настольным приложением, использующим 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.Фактическая проблема заключается в том, что BlurEffect вступает в силу только тогда, когда отображается окно инструмента.Это мы знаем, поскольку получение данных с сервера занимает пару секунд ... Кроме того, BlurEffect отображается только в том случае, если отображается окно инструмента.Если мы заменим диалог с некоторой задержкой (Task.Delay), размытие не будет видно.

У меня вопрос, как правильно обрабатывать такой подход?

1 Ответ

0 голосов
/ 27 апреля 2018

Создайте свойство 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 в 2 разных местах:

  1. Во время инициализации окна (в конструкторе или обработчике события Loaded) установите IsBlur = true для начала.
  2. В вашемМетод [получить данные с сервера], вам нужно иметь это как асинхронную задачу, когда она завершится, она должна обновить IsBlur = false.

Относительно того, как долго, это зависит от того, как долго [получить данные с сервера] требуется для завершения.Я не думаю, что это то, что вы должны отложить.Если вам действительно нужно отложить, просто установите задержку на [получить данные с сервера].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...