WPF中ListBox控件刷新问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中ListBox控件刷新问题相关的知识,希望对你有一定的参考价值。
程序里有这么一段:
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里有类似的东西么。。。
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);
参考技术A 有的,Dispatcher.Invoke
WPF中ListBox控件选择多个数据项
原文:WPF中ListBox控件选择多个数据项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> <StackPanel> <TextBlock>在控件中一次选择多个数据项:</TextBlock> <ListBox SelectionMode="Multiple"> <ListBoxItem>a</ListBoxItem> <ListBoxItem>b</ListBoxItem> <ListBoxItem>c</ListBoxItem> <ListBoxItem>d</ListBoxItem> <ListBoxItem>e</ListBoxItem> </ListBox> <TextBlock>在控件中使用Ctrl一次选择多个数据项:</TextBlock> <ListBox x:Name="lbx" SelectionMode="Extended"> <ListBox.ContextMenu> <ContextMenu> <MenuItem Header="Show" Click="btnShowSelectItems"></MenuItem> </ContextMenu> </ListBox.ContextMenu> <ListBoxItem>张三</ListBoxItem> <ListBoxItem>李四</ListBoxItem> <ListBoxItem>王五</ListBoxItem> <ListBoxItem>赵六</ListBoxItem> <ListBoxItem>孙七</ListBoxItem> </ListBox> </StackPanel> </Grid> </Window>
C#:
using System; using System.Collections.Generic; using System.Linq; using System.Text; 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 WpfApplication1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnShowSelectItems(object sender, RoutedEventArgs e) { string msg=string.Empty; List<string> list = new List<string>(); if (lbx.SelectedItems != null && lbx.SelectedItems.Count > 1) { //多选 foreach (ListBoxItem lbi in lbx.SelectedItems) { list.Add(lbi.Content.ToString()); } msg = string.Join(",", list); } else if (lbx.SelectedItems != null && lbx.SelectedItems.Count == 1) { //单选 msg = ((ListBoxItem)lbx.SelectedItem).Content.ToString(); } else { //没有选中任何项 } MessageBox.Show(msg); } } }
效果:
以上是关于WPF中ListBox控件刷新问题的主要内容,如果未能解决你的问题,请参考以下文章
C# WPF 可拖动用户控件在 Canvas 上的 ListBox 中
WPF Listbox 控件模板不显示 Listboxitem 控件模板和 ItemTemplate 数据模板