Окно сообщения, пока занято в WPF - PullRequest
3 голосов
/ 11 января 2012

Как отобразить окно сообщения или другое подобное уведомление, если приложение работает в фоновом режиме, аналогично этому макету:

enter image description here

Ответы [ 2 ]

8 голосов
/ 11 января 2012

В WPF Extended Toolkit есть индикатор занятости , который я использовал довольно часто:

Screenshot of the busy indicator

Набор инструментов удобно доступен через NuGet, что позволяет очень легко добавить его в качестве ссылки на ваш проект.Я лично использовал его (наряду со многими другими полезными элементами управления в этом наборе инструментов) почти во всех моих недавних проектах WPF.

Чтобы использовать его, окружите свои элементы управления в коде XAML с помощью индикатора занятости:

<extToolkit:BusyIndicator ...>
    <Grid>
        <Button Content="Click to do stuff" />
        <!-- your other stuff here -->
    </Grid>
</extToolkit:BusyIndicator>       

Тогда вам просто нужно установить для свойства IsBusy значение true, когда вы хотите, чтобы всплывающее окно появлялось, и значение false, когда оно должно быть скрыто.В правильной архитектуре MVVM вы, как правило, привязываете свойство XAML к свойству в вашей модели представления, для которого вы соответственно устанавливаете значение true / false:

<extToolkit:BusyIndicator IsBusy="{Binding IsBusy}" >

Но если вы не используете MVVM, вы можетеконечно, установите его вручную из своего кода, как правило, в обработчике нажатий кнопок:

Дайте элементу управления имя, чтобы можно было ссылаться на него из кода:

<extToolkit:BusyIndicator x:Name="busyIndicator" >

И затем,в вашем файле xaml.cs:

void myButton_Click(object sender, RoutedEventArgs e)
{
    busyIndicator.IsBusy = true;
    // Start your background work - this has to be done on a separate thread,
    // for example by using a BackgroundWorker
    var worker = new BackgroundWorker();
    worker.DoWork += (s,ev) => DoSomeWork();
    worker.RunWorkerCompleted += (s,ev) => busyIndicator.IsBusy = false;
    worker.RunWorkerAsync();
}
4 голосов
/ 11 января 2012

Если вы кодируете MVVM, это легко:

1.) Добавьте логический флаг «IsBusy» в вашу ViewModel с уведомлением об изменении.

public bool IsBusy {get {return _isBusy;} set{_isBusy=value;OnPropertyChanged("IsBusy");}}
private bool _isBusy;

2.) Добавьте два события в вашКоманды «Запущено» и «Завершено»

public event Action Completed;

public event Action Started;

3.) В вашей ViewModel подпишитесь на эти события и установите статус занятости.

LoadImagesCommand.Started += delegate { IsBusy = true; };
LoadImagesCommand.Completed += delegate { IsBusy = false; };

4.) В вашем окнетеперь вы можете привязаться к этому состоянию

<Popup Visibility="{Binding Path=IsBusy,Converter={StaticResource boolToVisibilityConverter}}"/>

Обратите внимание, что для последнего шага вы должны создать экземпляр boolToVisibilityConverter, поэтому:

5.) Добавьте следующее в любой загруженный словарь ресурсов:

<BooleanToVisibilityConverter x:Key="boolToVisibilityConverter"/>

Вот и все!Вы можете заполнить свой всплывающее окно с жизнью, которую вы хотите ...

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