我有一个wpf窗口,它有四个标签m1,m2,m3,m4。当我点击窗口中的一个按钮时,所有四个标签应该一个接一个地显示。但是我显示所有标签这应该不会发生。
private void button_Click(object sender, RoutedEventArgs e)
{
m1.Content = DateTime.Now.ToString("HH:mm:ss") + " Establishing Connection";
//some code
m2.Content = DateTime.Now.ToString("HH:mm:ss") + " Connected";
//some code
m3.Content = DateTime.Now.ToString("HH:mm:ss") + " Processing";
//some code
m4.Content = DateTime.Now.ToString("HH:mm:ss") + " Finished";
}
运行应用程序后,窗口显示以下所有标签,一次显示,而不是一个接一个地显示
10:14:20建立连接
10:14:24已连接
10:14:26处理
10:14:30完成
答案 0 :(得分:1)
您正在寻找的容器称为StackPanel,它会自动将任何元素一个接一个地放在其中。
实施例
<StackPanel Orientation="Vertical">
<Label Name="m1"/>
<Label Name="m2"/>
<Label Name="m3"/>
<Label Name="m4"/>
</StackPanel>
答案 1 :(得分:1)
您可以做的是在设置Content
的{{1}}之后,您可以切换Label
的{{1}},以便取代所有Visibility
你马上就会一个接一个地得到它。正如@Dan建议使用Label
来安排Label
。还要注意每个操作后更新UI线程的一个重要方面。
以下是我使用的示例代码。
MainWindow.xaml
StackPanel
MainWindow.xaml.cs
Label
我希望它有所帮助。您还可以使用<StackPanel>
<Button Content="Testing" Click="Button_Click" />
<Label Name="m1" Visibility="Hidden" />
<Label Name="m2" Visibility="Hidden" />
<Label Name="m3" Visibility="Hidden" />
<Label Name="m4" Visibility="Hidden" />
</StackPanel>
来避免UI冻结。
以下是使用public partial class MainWindow : Window
{
public MainWindow ()
{
InitializeComponent ();
}
private async void Button_Click (object sender, RoutedEventArgs e)
{
m1.Content = DateTime.Now.ToString ("HH:mm:ss") + " Establishing Connection";
m1.Visibility = Visibility.Visible;
await Task.Run (() => Thread.Sleep (2000));
m2.Content = DateTime.Now.ToString ("HH:mm:ss") + " Connected";
m2.Visibility = Visibility.Visible;
await Task.Run (() => Thread.Sleep (2000));
m3.Content = DateTime.Now.ToString ("HH:mm:ss") + " Processing";
m3.Visibility = Visibility.Visible;
await Task.Run (() => Thread.Sleep (2000));
m4.Content = DateTime.Now.ToString ("HH:mm:ss") + " Finished";
m4.Visibility = Visibility.Visible;
await Task.Run (() => Thread.Sleep (2000));
}
}
MainWindow.xaml.cs
BackgroundWorker