我正在使用三个.xaml windows.MainWindow.xaml从他/她的邮件帐户中获取用户的联系人。当用户点击"参见联系人"按钮我打了另一个窗口,显示标签"获取联系人.."当检索到联系人时,窗口消失,在另一个窗口中显示联系人。问题是,当我点击按钮时,"查看联系人"显示并关闭第二个窗口而不显示标签"获取联系人..."。
代码显示了一个联系人窗口,它应该显示联系人。在调用函数视图之前,我调用了show 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 :(得分:0)
您可以使用Dispatcher.Invoke
进行view
调用,以便您的UI线程可用:
Application.Current.Dispatcher.Invoke(() => view(u, p),
DispatcherPriority.ApplicationIdle);
您没有看到标签的原因是因为正在UI线程上进行工作。 UI线程是更新UI的线程。当您创建Contacts
类时,您当前在UI线程上,这意味着在UI线程可用于处理对象之前,您在屏幕上看到的内容将不会更新。这就是为什么当您希望UI显示您的标签时,工作已经完成(因为UI线程执行了您的view
方法和obj.Close
调用)
Invoke
做的是将调用延迟到view
,直到当前Dispatcher(即UI线程)为idle
。这使得它有时间更新窗口中存在的控件。
有很多关于线程,UI和调度程序的信息,这里的答案可能太多了。要阅读有关WPF中线程的更多信息,您可以查看MSDN(关于使用后台线程处理阻止操作的标题,我认为可能适合您)