Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF更新网格可见性_C#_Wpf_Xaml - Fatal编程技术网

C# WPF更新网格可见性

C# WPF更新网格可见性,c#,wpf,xaml,C#,Wpf,Xaml,在网上搜索之后,我设置了一个简单的示例: PropertyChangedBase.cs public class PropertyChangedBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { //Raise

在网上搜索之后,我设置了一个简单的示例:

PropertyChangedBase.cs

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.Collapsed1秒,看一下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;
}