none
wpf如何在事件中实时更改label的文本? RRS feed

  • 问题

  • 我要提供一个打印功能,一个窗体上面有一个label和一个button,点击button执行打印。

    我想要这样的效果,点击button后,label立即显示 “正在打印...”  打印完成之后  label显示“打印完成”。

    但实际的效果是  “正在打印...”  不显示,直接显示了 “打印完成”。也就是说,在button事件过程中,label的文本改变不会体现到窗体上。

    大致代码如下:

     private void btnOK_Click(object sender, RoutedEventArgs e)
            {

                 this.labelMessage.Content = "正在打印....";

                Print();

                 this.labelMessage.Content = "打印完成"; 

           }

    有没有哪位知道如何处理的,这里先谢过了!


    • 已编辑 shuhang 2012年5月16日 8:14
    2012年5月16日 8:13

答案

  • 问题已解决,下面是代码

    /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            BackgroundWorker backgroundWorker = new BackgroundWorker();

            public MainWindow()
            {
                InitializeComponent();
                backgroundWorker.DoWork += backgroundWorker_DoWork;
                backgroundWorker.RunWorkerCompleted += 
                    backgroundWorker_RunWorkerCompleted;
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                backgroundWorker.RunWorkerAsync();
            }

            private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            { 
                //do somthing
                this.Dispatcher.Invoke(new Action(() => {
                    this.label1.Content = "Start...";
                }));
                Thread.Sleep(5000);
            }

            private void backgroundWorker_RunWorkerCompleted(
                object sender, RunWorkerCompletedEventArgs e)
            { 
                //completed
                if (e.Cancelled)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Cancel...";
                    }));
                }
                else if (e.Error != null)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Error...";
                    }));
                }
                else
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Completed...";
                    }));
                }
            }

        }

    2012年5月17日 3:39

全部回复

  • 这里的Print是个异步函数(非阻塞函数),所以,实际上函数调用只是发出了print命令就返回了,然后执行了后面的this.labelMessage.Content = "打印完成";

    要解决这个问题,需要找到打印机对象的类似“打印完成”的事件,然后在这个事件代码中执行this.labelMessage.Content = "打印完成";

    我只是知道一点理论,没实际操作过,所以也没法告诉你具体的事件名称。


    2012年5月17日 2:32
  • 那么如果代码是这样的呢,先抛开打印方法的问题

    private void btnOK_Click(object sender, RoutedEventArgs e)
            {

                 this.labelMessage.Content = "正在打印....";

                 Thread.Sleep(5000);

                 this.labelMessage.Content = "打印完成"; 

           }

    有没有哪

    2012年5月17日 2:37
  • 问题已解决,下面是代码

    /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            BackgroundWorker backgroundWorker = new BackgroundWorker();

            public MainWindow()
            {
                InitializeComponent();
                backgroundWorker.DoWork += backgroundWorker_DoWork;
                backgroundWorker.RunWorkerCompleted += 
                    backgroundWorker_RunWorkerCompleted;
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                backgroundWorker.RunWorkerAsync();
            }

            private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            { 
                //do somthing
                this.Dispatcher.Invoke(new Action(() => {
                    this.label1.Content = "Start...";
                }));
                Thread.Sleep(5000);
            }

            private void backgroundWorker_RunWorkerCompleted(
                object sender, RunWorkerCompletedEventArgs e)
            { 
                //completed
                if (e.Cancelled)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Cancel...";
                    }));
                }
                else if (e.Error != null)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Error...";
                    }));
                }
                else
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        this.label1.Content = "Completed...";
                    }));
                }
            }

        }

    2012年5月17日 3:39