2012-01-11 20 views
3

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

enter image description here

+0

Вы имеете в виду ожидающее уведомление, такое как Glass-Hour? –

+0

Возможный дубликат [Есть ли окно сообщений WPF?] (Http: // stackoverflow.com/questions/3830228/is-there-a-wpf-message-box) Или вы всегда можете создать свое собственное окно ... –

+1

@CodyGray: Я не это, что подразумевает OP, тем больше ждет значок отображается, когда обработка выполняется в пользовательском интерфейсе. –

ответ

8

Существует в Busy IndicatorWPF 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, когда вы хотите, всплывающее окно появятся и ложный, когда он должен быть скрытым. В правильной архитектуре MVVM, то, как правило, привязка свойства в XAML свойству в вашем ViewModel, которые вы затем установить истину/ложь соответственно:

<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(); 
} 
+0

Благодарим вас за помощь – murmansk

4

Если код 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"/> 

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

+0

И если вы не используете MVVM, это также легко; это не имеет ничего общего с MVVM. Вы можете делать все, что вы можете сделать с MVVM, но это не так просто. –

+0

Я не думаю, что этот материал MVVM входит в мой мозг, я довольно новичок в WPF, это их простой метод, используя только файлы .caml и .xaml.cs. – murmansk

+0

Используя xaml.cs, вы можете это сделать. Только это сделает ваш пользовательский интерфейс немного более насыщенным по статусу, но в основном вы можете определить всплывающее окно в вашем XAML, а затем использовать Popup.Visibility = Visibility.Hidden/Visible, чтобы скрыть или показать ваше всплывающее окно. –

Смежные вопросы