5

更新したい wpf の StatusBar に TextBox があります。

ListBox にファイルのリストがあります。各ファイルで、たとえばメソッド 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 には最後のファイルの名前しか表示されません。コードの何が問題になっていますか? どうすれば修正できますか?

4

2 に答える 2

4

これを行う方法は他にもあります。

コードからコンテンツを直接設定するコンテンツにアクセスできるよう
に、に名前を付ける必要があります。TextBox

XAML

<TextBox x:Name="myTextBox" />

C#

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

データ バインディングを使用する
オブジェクトを作成し、そのテキスト ボックス (ステータス バー、ウィンドウなど) を含む WPF 要素DataContextに設定する必要があります。TextBox

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));
        }
    }
} 

データ バインディングの詳細については、「データ バインディングの概要」を参照してください。

于 2010-04-30T10:23:17.320 に答える
1

ViewModel を使用している場合、ViewModel でプロパティ「ProcessedFile」を定義し、StatusBar の Textbox をプロパティにバインドします。

ファイルを処理するたびに、プロパティ「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
    }
}

TextBox をプロパティにバインドする XAML を次に示します。(ViewModel は TextBox の DataContext として設定されていると仮定します)

<TextBox Text="{Binding ProcessedFile, Mode=OneWay}"/>
于 2010-04-30T10:07:14.013 に答える