C# WPF更新网格可见性
在网上搜索之后,我设置了一个简单的示例: PropertyChangedBase.csC# WPF更新网格可见性,c#,wpf,xaml,C#,Wpf,Xaml,在网上搜索之后,我设置了一个简单的示例: PropertyChangedBase.cs public class PropertyChangedBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { //Raise
public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
//Raise the PropertyChanged event on the UI Thread, with the relevant propertyName parameter:
Application.Current.Dispatcher.BeginInvoke((Action)(() => {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}));
}
}
UserViewModel.cs
public class UserViewModel : PropertyChangedBase
{
private Visibility _showUserWindow = Visibility.Collapsed;
public Visibility ShowUserWindow {
get { return _showUserWindow; }
set {
_showUserWindow = value;
OnPropertyChanged("ShowUserWindow"); //This is important!!!
}
}
}
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid Margin="43,28,247,129" Background="AliceBlue" Visibility="{Binding ShowUserWindow}"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="349,150,0,0" VerticalAlignment="Top" Width="75" PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown"/>
</Grid>
</Window>
现在网格在1秒后崩溃,我想在计时器启动之前更新UI。我做错了什么
编辑:
Sleep行需要一些工作,这需要一些时间才能完成。
在工作开始之前,网格应该变得可见,并显示关于该工作的一些信息,并在工作完成后崩溃。 < P>。您应该考虑在一个单独的线程上执行<强>线程。睡眠(1000)<强>操作,而不是在UI线程上。检查一下。 除此之外,在将其
可见性设置为折叠后,尝试使用yourGrid.UpdateLayout()
方法
乐:
最有可能的是,他的线程.Sleep(1000)
代表类似数据库操作的东西,例如,需要时间的东西
LE2:A后台工作人员将完成此任务。检查 如果您使用的是.NET 4.5,则可以使用Task.Delay()允许UI在开始实际工作之前进行自我更新:
private async void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
userViewModel.ShowUserWindow = Visibility.Visible;
await Task.Delay(1);
Thread.Sleep(1000);
userViewModel.ShowUserWindow = Visibility.Collapsed;
}
请注意,等待任务。延迟(1)即使在用实际工作替换Thread.Sleep(1000)
之后,也应该使用code>
但是,只有当您的工作只能在UI线程中完成,并且不能移动到后台线程(例如,大量加载UI元素)时,才应使用此选项。否则,正确的方法是将工作移动到后台线程:
private async void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
userViewModel.ShowUserWindow = Visibility.Visible;
await Task.Start(() => {
Thread.Sleep(1000);
};
userViewModel.ShowUserWindow = Visibility.Collapsed;
}
为什么有Thread.Sleep行?我们在这里要做什么?如果你想延迟userViewModel.ShowUserWindow=Visibility.Collapsed代码>1秒,看一下replace Thead.Sleep by Task.Delay…所以你现在/想要的更多的是一个“Progress”显示。。。嘿我在这里工作。。。给我一分钟把事情安排好。。。然后消失?我想后台工作人员帮了你(对吧?),只是为了让未来的访客明白。祝你好运UpdateLayout()
不会有帮助。我不知道它的确切原因,但我认为任何UI重画操作都会发送到Dispatcher queue,并且在UI线程中的当前代码完成之前,队列不会继续(显然,在thread.Sleep
完成之前,它不会完成)。
private async void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
userViewModel.ShowUserWindow = Visibility.Visible;
await Task.Start(() => {
Thread.Sleep(1000);
};
userViewModel.ShowUserWindow = Visibility.Collapsed;
}