3

以下の 2 つのコード セグメントは、異なる名前空間にあります。そして、2 番目のコードのアクセス修飾子は internal です。私はそこでいくつかの操作を行っており、パーセンテージを計算して MgmntApp プログレスバーで更新したいと考えています。これどうやってするの?

WpfApplication1

MainWindow.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 Height="204">
        <ProgressBar Height="35" HorizontalAlignment="Left" Margin="57,83,0,0" Name="progressBar1" VerticalAlignment="Top" Width="346" />
    </Grid>
</Window>

以下のクラスで長時間実行される操作を実行しているときに、進行状況バーの値を更新したいと考えています。

違う

FileParser.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Different
{
    /// <summary>
    /// </summary>
    internal class FileParser:ImageFileParser
    {
        ImageFileParser.GenerateCmds()
        {
            percentage=change;    //0 to 100
            //long time operation
        }
    }
}
4

2 に答える 2

2

解析に時間がかかる場合は、別のスレッドで実行することをお勧めします。

進行状況が変化したときに FileParser でイベントを発生させ、MainWindow でこのイベントをサブスクライブできます。

private void StartParsing()
{
    FileParser fp = new FileParser("FileName.txt");
    fp.ProgressChanged += FileParser_ProgressChanged;
    Thread t = new Thread(fp.GenerateCmds);
    t.Start();
}

private void FileParser_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // switch to the UI thread if fileparser is running on a different thread
    Dispatcher.BeginInvoke(new Action(
                              () => { progressbar.Value = e.ProgressPercentage; }));
}

これを可能にするには、FileParser にイベントを追加する必要があります。

internal class FileParser:ImageFileParser
{
    internal event EventHandler<ProgressChangedEventArgs> ProgressChanged;

    ImageFileParser.GenerateCmds()
    {
        percentage=change;    //0 to 100
        OnProgressChanged(percentage);
        //long time operation
    }

    internal protected void OnProgressChanged(int percentage)
    {
        var p = ProgressChanged;
        if(p != null)
        {
            p(this, new ProgressChangedEventArgs(percentage, null));
        }
    }
}
于 2012-05-22T07:24:08.560 に答える
1

FileParserクラスのプロパティにバインドしないのはなぜですか?

<ProgressBar Value="{Binding MyFileParser.PercentComplete}" ...

次に、FileParserにINotifyPropertyChangedを実装させます。

internal class FileParser:ImageFileParser, INotifyPropertyChanged
{
    private decimal _pct;
    internal decimal PercentComplete { 
        get { return _pct; }
        set {
            _pct = value;
            PropertyChanged(this, new PropertyChangedEventArgs("PercentComplete"));
        }
    }
    PropertyChanged(this, new PropertyChangedEventArgs(info));

    ImageFileParser.GenerateCmds()
    {
        PercentComplete = change;    //0 to 100
        //long time operation
    }
}

次に、必要に応じてPercentCompleteプロパティを更新するだけです...

于 2012-05-22T07:17:05.197 に答える