2011-02-02 89 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; 
     } 
    } 
相关问题