标签在窗口上不可见

时间:2015-01-16 12:10:57

标签: c# .net wpf xaml

我正在使用三个.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>

1 个答案:

答案 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(关于使用后台线程处理阻止操作的标题,我认为可能适合您)