WPF中ListBox控件刷新问题
程序里有这么一段:privatevoidButton_Click(objectsender,RoutedEventArgse){box.Items.add("string...
程序里有这么一段:
private void Button_Click(object sender, RoutedEventArgs e)
{
box.Items.add("string A");
func();
box.Items.add("string B");
}
其中box是ListBox实例,func()是一个耗时操作(2秒左右)
我想要的效果是首先在ListBox中输出了string A,然后界面停住(因为去执行func()了),func()完毕后输出string B
但现在的现象是Button被按下后界面卡住,直到func()执行完后,string A和string B同时输出了
请问这个问题怎么解决
貌似winform里ListBox控件有个Refresh()方法可以刷新,wpf里有类似的东西么。。。 展开
private void Button_Click(object sender, RoutedEventArgs e)
{
box.Items.add("string A");
func();
box.Items.add("string B");
}
其中box是ListBox实例,func()是一个耗时操作(2秒左右)
我想要的效果是首先在ListBox中输出了string A,然后界面停住(因为去执行func()了),func()完毕后输出string B
但现在的现象是Button被按下后界面卡住,直到func()执行完后,string A和string B同时输出了
请问这个问题怎么解决
貌似winform里ListBox控件有个Refresh()方法可以刷新,wpf里有类似的东西么。。。 展开
2个回答
展开全部
WPF采用了与原来WinForm完全不同的刷新机制。在WPF中,只能通过Dispatcher.BeginInvoke方法来刷新UI元素
实现你要求的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfUIAsyncUpdate
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
box.Items.Add("String A");
//启动一个线程
Thread t = new Thread(LongWork);
t.IsBackground = true;
t.Start();
}
private void LongWork()
{
Thread.Sleep(8000); //模拟一个耗时的操作
//向ListBox添加一个项 "String B"
//由于LongWork运行在后台线程上
//所以必须通过box.Dispatcher.BeginInvoke来刷新界面
//这与WinForm中跨线程刷新控件有些类似
box.Dispatcher.BeginInvoke(
new Action(() => { box.Items.Add("String B"); }),
null);
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询