2015-01-16 3 views
0

Я использую три окна .xaml.MainWindow.xaml получает контакты пользователя из своей учетной записи электронной почты. Когда пользователь нажимает кнопку «См. Контакты», я вызываю другое окно, которое показывает ярлык «Получение контактов ..», а при восстановлении контактов окно «Исчезает», а в другом окне отображаются контакты. Проблема заключается в том, что, когда я нажимаю кнопку «См. контакты», появляется и закрывается второе окно без указания метки «Получение контактов» ... ". код показывает окно контактов, которые, как предполагается, чтобы показать contacts.Before вызова функции просмотра я назвал шоу process.xaml и после этого я закрыл Но ярлык на нем не показано
contacts.xaml.csЯрлык не отображается в окне

 public Contacts(string u,string p) 
     { 
      process obj = new process(); 

      InitializeComponent(); 
      obj.Show(); 
      view(u, p);//it gets the contacts 
      obj.Close();//window closes here 
     } 

Process.xaml

<Window x:Class="Practice_project.process" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="process" Height="100" Width="167" 
     WindowStyle="ToolWindow"> 
    <Grid > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*" ></ColumnDefinition> 
      <ColumnDefinition Width="1*" ></ColumnDefinition> 

      <ColumnDefinition Width="1*" ></ColumnDefinition> 
      <ColumnDefinition Width="1*" ></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*"></RowDefinition> 
      <RowDefinition Height="1*"></RowDefinition> 
      <RowDefinition Height="1*"></RowDefinition> 
      <RowDefinition Height="1*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Label Content="Getting Contacts..." FontSize="20" Margin="0,23,-0.2,0" Grid.RowSpan="3" Grid.ColumnSpan="4" Height="46" VerticalAlignment="Top"/> 
    </Grid> 
</Window> 
+0

Вы не устанавливая строку сетки и столбец для метки. – danish

+3

@danish значения по умолчанию для строки и столбца равно 0. Поэтому это не проблема –

+0

try Настройка obj.Owner = это перед показом окна 'Process' ... –

ответ

0

Вы можете использовать Dispatcher.Invoke для view вызова, чтобы ваш поток пользовательского интерфейса становится доступным:

Application.Current.Dispatcher.Invoke(() => view(u, p), 
             DispatcherPriority.ApplicationIdle); 

Причина, по которой вы не видите ярлык, заключается в том, что работа выполняется в потоке пользовательского интерфейса. Поток пользовательского интерфейса - это поток, который обновляет ваш пользовательский интерфейс. Когда вы создаете свой класс Contacts, вы в настоящее время находитесь в потоке пользовательского интерфейса, то есть то, что вы видите на экране, не будет обновляться до тех пор, пока поток пользовательского интерфейса не станет доступен для обработки объектов. Вот почему, когда вы ожидаете пользовательский интерфейс, чтобы показать этикетку работа уже завершена (так как поток пользовательского интерфейса выполняется ваш метод view и obj.Close вызова)

Что Invoke делает это задержать вызов view до текущего Dispatcher (т.е. поток пользовательского интерфейса) - idle. Это дает время для обновления элементов управления, существующих в окне.

Существует много информации о потоковом, пользовательском интерфейсе и диспетчере, возможно, слишком много, чтобы существовать в одном ответе здесь. Чтобы узнать больше о многопоточности в WPF вы можете проверить MSDN (Там же заголовок относительно Обращения к блокированию операции с фоновым потоком, что я думаю, что может удовлетворить вас)

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