2011-02-02 98 views

回答

4

您可以使用BackgroundWorker類,它可以在使用WPF時簡化對後臺線程的處理。 網上有很多這方面的例子。這裏有兩個從CodeProject,但它很容易找到更多的例子:

http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

+1

但是,當我訪問在後臺工作的控件,它拋出異常:調用線程不能因爲不同的訪問這個對象線程擁有它。 – Sandy 2011-02-02 08:35:52

1

我希望通過演示模型來控制視圖狀態。當視圖需要將地址中的項目填充到演示模型時,該演示模型將啓動工作線程並在UI同步上下文中更新其進度值。

public class SampleModel : ObservableObject 
{ 
    private ObservableCollection<string> _items = new ObservableCollection<string>(); 
    public IEnumerable<string> Items 
    { 
     get 
     { 
      return this._items; 
     } 
    } 

    private int _progress; 
    public int Progress 
    { 
     get 
     { 
      return this._progress; 
     } 
     set 
     { 
      if (this._progress != value) 
      { 
       this._progress = value; 
       this.OnPropertyChanged("Progress"); 
      } 
     } 
    } 

    public void Fill() 
    { 
     this.Progress = 0; 
     var sc = SynchronizationContext.Current; 

     new Thread(new ThreadStart(() => 
      { 
       for (int i = 0; i < 100; i++) 
       { 
        sc.Post(p => 
         { 
          this._items.Add(i.ToString()); 
          this.Progress ++; 
         }, null); 
        Thread.Sleep(100); 
       } 

       sc.Post(p => 
       { 
        this.Progress = 0; 
       }, null); 

      })) 
      .Start(); 
    } 
} 

XAML:

<DockPanel> 
    <ProgressBar Minimum="0" 
       Maximum="100" 
       Height="50" 
       Value="{Binding Progress}" 
       DockPanel.Dock="Top"> 
     <ProgressBar.Style> 
      <Style TargetType="ProgressBar"> 
       <Setter Property="IsEnabled" 
         Value="True"/> 
      </Style> 
     </ProgressBar.Style> 
    </ProgressBar> 
    <Button Name="Start" 
      DockPanel.Dock="Top">Start</Button> 
    <ListView Name="List" 
       ItemsSource="{Binding Items}"/> 
</DockPanel> 

而後面的代碼:

public MainWindow() 
    { 
     InitializeComponent(); 
     this.Model = new SampleModel(); 
     this.Start.Click += new RoutedEventHandler(Start_Click); 
    } 

    void Start_Click(object sender, RoutedEventArgs e) 
    { 
     this.Model.Fill(); 
    } 

    protected SampleModel Model 
    { 
     get 
     { 
      return (SampleModel)this.DataContext; 
     } 
     set 
     { 
      this.DataContext = value; 
     } 
    } 
相關問題