C# 延迟更新WPF页面上的文本

C# 延迟更新WPF页面上的文本,c#,wpf,C#,Wpf,我是WPF新手,必须把一个基本的应用程序放在一起 它由一个带框架的主窗口和一个页面组成 该页面有一个基本状态文本- 要求是当页面加载时,应用程序必须执行一系列REST调用来从远程源获取一些数据,并在获取时更新状态文本 问题是,当我更新文本时,它似乎没有反映在页面上,或者它被阻止了——即使我使用了任务 到目前为止,我有以下测试代码: private void Page_Loaded(object sender, RoutedEventArgs e) { var wnd = Win

我是WPF新手,必须把一个基本的应用程序放在一起

它由一个带框架的主窗口和一个页面组成 该页面有一个基本状态文本-

要求是当页面加载时,应用程序必须执行一系列REST调用来从远程源获取一些数据,并在获取时更新状态文本

问题是,当我更新文本时,它似乎没有反映在页面上,或者它被阻止了——即使我使用了任务

到目前为止,我有以下测试代码:

 private void Page_Loaded(object sender, RoutedEventArgs e) {
        var wnd = Window.GetWindow(this);
        wnd.ContentRendered += Wnd_ContentRendered;            
    }

    private void Wnd_ContentRendered(object sender, EventArgs e) {
        DisplayMessages();            
    }

    private void DisplayMessages() {
        authenticationText.Text = "text one";
        var t = Task.Delay(5000);
        t.Wait();
        authenticationText.Text = "text two";
        t = Task.Delay(5000);
        t.Wait();
        authenticationText.Text = "text three";
        t = Task.Delay(5000);
        t.Wait();
    }
即使我在每个任务后都在等待,UI也不会得到更新——而是在方法完成后直接显示文本三——建议


附言:在那个页面上还有一个WPF加载程序,我注意到它也没有被动画化-看起来延迟在起作用,但是UI上的所有内容都没有更新

我建议从REST实现中获取数据,您应该使用后台工作线程,在线程完成或进度更改的基础上,您需要相应地更新UI线程

为了更好地了解背景工作者。。请使用此链接

在您的情况下,您可以使用backgroundworker的progresschanged事件


请使用InotifyPropertyChanged接口创建一些属性,比如StatusText,并将其与authenticationText控件的Text属性绑定(使用双向绑定)。。。。在backgroundworker的progress changed事件中,设置StatusText属性的值,该属性将自动更新UI。

我建议从REST实现中获取数据,您应该使用后台工作线程,在线程完成或进度更改的基础上,您需要相应地更新UI线程

为了更好地了解背景工作者。。请使用此链接

在您的情况下,您可以使用backgroundworker的progresschanged事件


请使用InotifyPropertyChanged接口创建一些属性,比如StatusText,并将其与authenticationText控件的Text属性绑定(使用双向绑定)。。。。在backgroundworker的progress changed事件中,设置StatusText属性的值,该属性将自动更新UI。

您可以尝试在UI线程上调用这些结果。。。 使用task.Run或其他工具正常运行任务。每次准备在UI线程上设置某些属性时,都应该通过dispatcher调用它

    Task.Run(() =>
    {
        var _Temp = getSomePropTask();
        Thread.Sleep(1000);
        App.Current.Dispatcher.Invoke(()=>{
            authenticationText.Text = _Temp;
        });
    });

您可以尝试在UI线程上调用这些结果。。。 使用task.Run或其他工具正常运行任务。每次准备在UI线程上设置某些属性时,都应该通过dispatcher调用它

    Task.Run(() =>
    {
        var _Temp = getSomePropTask();
        Thread.Sleep(1000);
        App.Current.Dispatcher.Invoke(()=>{
            authenticationText.Text = _Temp;
        });
    });

多亏了Ashok的建议,我做了一些背景阅读,并使用Task、async和await提出了以下解决方案-这比后台工作线程更易于管理:

private void Page_Loaded(object sender, RoutedEventArgs e) {
    var wnd = Window.GetWindow(this);
    wnd.ContentRendered += Wnd_ContentRendered;            
}

private void Wnd_ContentRendered(object sender, EventArgs e) {
    GetDataAsync();            
}

 private async void GetDataAsync() {
        authenticationText.Text = "Connecting...";
        await Task.Delay(5000);
        authenticationText.Text = "Getting Member Details...";
        List<MemberServiceModel> memberList = await GetMembersAsync();

        // more code for handling response
}


private List<MemberServiceModel> GetMembers() {
            //get all members synchronous
            var request = new RestRequest("Members/Admin", Method.GET);
            var response = _client.Execute<List<MemberServiceModel>>(request);
            if (response.ResponseStatus != ResponseStatus.Completed) {
                //TODO
                _restErrorStatus = response.ResponseStatus.ToString();
                _restErrorMessage = response.StatusDescription;
                _logger.Error("Error in GetMembers");
                _logger.Error("Status:" + _restErrorStatus);
                _logger.Error("Description:" + _restErrorMessage);
            }
            return response.Data; ;
        }

        private Task<List<MemberServiceModel>> GetMembersAsync() {
            //get all members asynchronous
            return Task.Run(new Func<List<MemberServiceModel>>(GetMembers));
        }
private void页面\u已加载(对象发送方,路由目标){
var wnd=Window.GetWindow(这个);
wnd.ContentRendered+=wnd_ContentRendered;
}
私有void Wnd_ContentRendered(对象发送方,事件参数e){
GetDataAsync();
}
私有异步void GetDataAsync(){
authenticationText.Text=“正在连接…”;
等待任务。延迟(5000);
authenticationText.Text=“获取成员详细信息…”;
List memberList=等待GetMembersAsync();
//更多处理响应的代码
}
私有列表GetMembers(){
//使所有成员同步
var request=new RestRequest(“Members/Admin”,Method.GET);
var响应=_client.Execute(请求);
if(response.ResponseStatus!=ResponseStatus.Completed){
//待办事项
_restErrorStatus=response.ResponseStatus.ToString();
_restErrorMessage=response.StatusDescription;
_logger.Error(“GetMembers中的错误”);
_logger.Error(“状态:”+_restErrorStatus);
_logger.Error(“说明:”+_restErrorMessage);
}
返回响应。数据;
}
私有任务GetMembersAsync(){
//使所有成员异步
返回Task.Run(newfunc(GetMembers));
}

多亏了Ashok的建议,我做了一些后台阅读,并使用Task、async和await提出了以下解决方案,这比后台工作线程更易于管理:

private void Page_Loaded(object sender, RoutedEventArgs e) {
    var wnd = Window.GetWindow(this);
    wnd.ContentRendered += Wnd_ContentRendered;            
}

private void Wnd_ContentRendered(object sender, EventArgs e) {
    GetDataAsync();            
}

 private async void GetDataAsync() {
        authenticationText.Text = "Connecting...";
        await Task.Delay(5000);
        authenticationText.Text = "Getting Member Details...";
        List<MemberServiceModel> memberList = await GetMembersAsync();

        // more code for handling response
}


private List<MemberServiceModel> GetMembers() {
            //get all members synchronous
            var request = new RestRequest("Members/Admin", Method.GET);
            var response = _client.Execute<List<MemberServiceModel>>(request);
            if (response.ResponseStatus != ResponseStatus.Completed) {
                //TODO
                _restErrorStatus = response.ResponseStatus.ToString();
                _restErrorMessage = response.StatusDescription;
                _logger.Error("Error in GetMembers");
                _logger.Error("Status:" + _restErrorStatus);
                _logger.Error("Description:" + _restErrorMessage);
            }
            return response.Data; ;
        }

        private Task<List<MemberServiceModel>> GetMembersAsync() {
            //get all members asynchronous
            return Task.Run(new Func<List<MemberServiceModel>>(GetMembers));
        }
private void页面\u已加载(对象发送方,路由目标){
var wnd=Window.GetWindow(这个);
wnd.ContentRendered+=wnd_ContentRendered;
}
私有void Wnd_ContentRendered(对象发送方,事件参数e){
GetDataAsync();
}
私有异步void GetDataAsync(){
authenticationText.Text=“正在连接…”;
等待任务。延迟(5000);
authenticationText.Text=“获取成员详细信息…”;
List memberList=等待GetMembersAsync();
//更多处理响应的代码
}
私有列表GetMembers(){
//使所有成员同步
var request=new RestRequest(“Members/Admin”,Method.GET);
var响应=_client.Execute(请求);
if(response.ResponseStatus!=ResponseStatus.Completed){
//待办事项
_restErrorStatus=response.ResponseStatus.ToString();
_restErrorMessage=response.StatusDescription;
_logger.Error(“GetMembers中的错误”);
_logger.Error(“状态:”+_restErrorStatus);
_logger.Error(“说明:”+_restErrorMessage);
}
返回响应。数据;
}
私有任务GetMembersAsync(){
//使所有成员异步
返回Task.Run(newfunc(GetMembers));
}
您是否实现了“Ino”