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控件刷新问题的主要内容,如果未能解决你的问题,请参考以下文章

wpf里的listbox控件问题

C# WPF 可拖动用户控件在 Canvas 上的 ListBox 中

WPF中ListBox控件选择多个数据项

WPF Listbox 控件模板不显示 Listboxitem 控件模板和 ItemTemplate 数据模板

从代码隐藏(C#、WPF)添加时,用户控件无法在 ListBox 中正确显示

wpf listbox 内的内容显示问题,需要设置里面的itemsPresenter