window 上的标签不可见
Label not visible on the window
我正在使用三个。xaml windows.MainWindow.xaml 从 his/her 邮件中获取用户的联系方式 account.When 用户点击我呼叫的 "See Contacts" 按钮另一个 window 显示标签 "Getting Contacts.." 并且当检索到联系人时 window 消失并且在另一个 window 中联系人是 shown.The 问题是当我点击按钮 "See Contacts" 第二个 window 出现并关闭而不显示标签 "Getting Contacts..."。
代码显示了一个联系人 window 应该显示 contacts.Before 调用函数视图我调用了 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>
您可以使用 Dispatcher.Invoke
进行 view
通话,以便您的 UI 线程可用:
Application.Current.Dispatcher.Invoke(() => view(u, p),
DispatcherPriority.ApplicationIdle);
您看不到标签的原因是工作是在 UI 线程上进行的。 UI 线程是正在更新您的 UI 的线程。当您创建 Contacts
class 时,您当前处于 UI 线程,这意味着您在屏幕上看到的内容将不会更新,直到 UI 线程可用于处理objects。这就是为什么当您期望 UI 显示您的标签时,工作已经完成(因为 UI 线程执行了您的 view
方法和 obj.Close
调用)
Invoke
所做的是延迟对 view
的调用,直到当前 Dispatcher(即 UI 线程)为 idle
。这使它有时间更新 Window.
中存在的控件
有很多关于线程、UI 和 Dispatcher 的信息,可能太多了,无法在此处的单个答案中存在。要阅读有关 WPF 中线程的更多信息,您可以查看 MSDN(我认为可能适合您的标题是关于 使用后台线程处理阻塞操作)
我正在使用三个。xaml windows.MainWindow.xaml 从 his/her 邮件中获取用户的联系方式 account.When 用户点击我呼叫的 "See Contacts" 按钮另一个 window 显示标签 "Getting Contacts.." 并且当检索到联系人时 window 消失并且在另一个 window 中联系人是 shown.The 问题是当我点击按钮 "See Contacts" 第二个 window 出现并关闭而不显示标签 "Getting Contacts..."。
代码显示了一个联系人 window 应该显示 contacts.Before 调用函数视图我调用了 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>
您可以使用 Dispatcher.Invoke
进行 view
通话,以便您的 UI 线程可用:
Application.Current.Dispatcher.Invoke(() => view(u, p),
DispatcherPriority.ApplicationIdle);
您看不到标签的原因是工作是在 UI 线程上进行的。 UI 线程是正在更新您的 UI 的线程。当您创建 Contacts
class 时,您当前处于 UI 线程,这意味着您在屏幕上看到的内容将不会更新,直到 UI 线程可用于处理objects。这就是为什么当您期望 UI 显示您的标签时,工作已经完成(因为 UI 线程执行了您的 view
方法和 obj.Close
调用)
Invoke
所做的是延迟对 view
的调用,直到当前 Dispatcher(即 UI 线程)为 idle
。这使它有时间更新 Window.
有很多关于线程、UI 和 Dispatcher 的信息,可能太多了,无法在此处的单个答案中存在。要阅读有关 WPF 中线程的更多信息,您可以查看 MSDN(我认为可能适合您的标题是关于 使用后台线程处理阻塞操作)