使用C#在wpf中更新StatusBar中的文本

时间:2010-04-30 09:47:40

标签: wpf statusbar

我在wpf的StatusBar中有一个TextBox,我想要更新。

我在ListBox中有一个文件列表。在每个文件上,我将通过调用say方法ProcessFile()来执行某些操作。 因此,每当文件处理完成时,我想在StatusBar文本中显示该文件的名称。

我尝试过这样的事情:

private void button_Click(object sender, RoutedEventArgs e)
    {

        statusBar.Visibility = Visibility.Visible;

        DispatcherFrame frame = new DispatcherFrame();
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(TimeConsumingMethod), frame);
        Dispatcher.PushFrame(frame);
        statusBar.Visibility = Visibility.Collapsed;
    }

    public object TimeConsumingMethod(Object arg)
    {
        ((DispatcherFrame)arg).Continue = false;

        foreach (string fileName in destinationFilesList.Items)
        {
            txtStatus.Text = fileName.ToString();
            //Assume that each process takes some time to complete
            System.Threading.Thread.Sleep(1000);
        }
        return null;
    }

但我只能在StatusBar中看到最后一个文件的名称。 代码有什么问题?有人能纠正吗? 感谢。

2 个答案:

答案 0 :(得分:3)

还有更多方法可以做到这一点。

直接从代码设置内容
您需要为TextBox指定名称,以便您可以访问其内容:

XAML

<TextBox x:Name="myTextBox" />

C#

...
ProcessFile(someFileName);
myTextBox.Text = someFileName;

使用数据绑定
您需要创建一些对象并将其设置为DataContextTextBox或包含该文本框的一些WPF元素(状态栏,窗口,...)。

XAML:

<TextBox Text="{Binding Path=ProcessedFileName}" />

C#

public MyClass : INotifyPropertyChanged
{
    public string ProcessedFileName {get; set;} 

    public void ProcessFile(string someFileName)
    {
       // Processing file code here

       // When done processing, set file name to property
       ProcessedFileName = someFileName;
       OnPropertyChanged("ProcessedFileName");
    } 

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
} 

有关数据绑定的更多信息,请参阅Data Binding Overview

答案 1 :(得分:1)

当您使用ViewModel时,我会在ViewModel中定义一个属性“ProcessedFile”,并将StatusBar的Textbox绑定到Property。

每次处理文件时,我都会将属性“ProcessedFile”设置为文件名。

以下是ViewModel的一些代码。

public class ViewModel : INotifyPropertyChanged {
    private string _processedFile;
    public string ProcessedFile {
        get {
            return _processedFile;
        }
        set {

            if (_processedFile != value) {
                _processedFile = value;

                if (PropertyChanged != null) {
                    PropertyChanged(this, new PropertyChangedEventArgs("ProcessedFile"));
                }
            }
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    public void ProcessFile() {
       // Process the file
       ProcessedFile = //Set the Property to the processed file
    }
}

继承XAML将TextBox绑定到Property。 (我假设ViewModel被设置为TextBox的DataContext)

<TextBox Text="{Binding ProcessedFile, Mode=OneWay}"/>