2012-05-22 1 views
3

아래의 두 코드 세그먼트는 서로 다른 네임 스페이스에 있습니다. 두 번째 코드의 액세스 한정자는 내부입니다. 거기서 몇 가지 작업을하고 있는데, 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 
     } 
    } 
} 

답변

1

왜 당신의 FileParser 클래스의 속성에 바인딩하지? 구문 분석 당신이 수도 시간이 오래 걸리는 경우

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 속성을 업데이트 ...

2

:

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

그런 다음 FileParser이을에서 INotifyPropertyChanged 구현이 별도의 스레드에서 실행하고 싶습니다.

당신은 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)); 
     } 
    } 
} 
+0

하지만 fp.GenerateCmds()는 PrgmCmdGen이라는 또 하나의 클래스에 의해 호출됩니다. UI 업데이트 방법 (UI에서 progressBar1에 액세스 할 수 없습니다. – SHRI

+0

로직 내에서 뷰를 업데이트하지 마십시오.) PrgmCmdGen 클래스를 이벤트에 구독하고 PrgmCmdGen 클래스에서 다른 ProgressChanged 이벤트를 노출합니다 (이벤트를 버블 링합니다.)) 내 대답에서 제안한대로 구독하십시오. –

+0

new ProgressChangedEventArgs (percentage)); 이것은 오류를주는 것입니다. 하나 이상의 매개 변수 UserState가 묻습니다. – SHRI