Как запустить индикатор выполнения в другой теме в WPF? - PullRequest
0 голосов
/ 02 февраля 2011

Я динамически заполняю элементы списка. В то же время я хочу отобразить индикатор выполнения. Когда данные заполнены, индикатор выполнения должен быть отключен. Как этого добиться. Я новичок в WPF.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Вы можете использовать класс BackgroundWorker, который упрощает обработку фоновых потоков при работе с WPF. В Интернете есть множество примеров для этого. Здесь два из codeproject, но больше примеров легко найти:

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

1 голос
/ 02 февраля 2011

Я предпочитаю контролировать состояние просмотра через модель презентации.Когда представление должно заполнять элементы в адресе к модели представления, которая запускает рабочий поток и обновляет свои значения прогресса в контексте синхронизации пользовательского интерфейса.

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