Обновление прогресса потока в любом приложении уровня WPF - PullRequest
0 голосов
/ 04 ноября 2011

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

Некоторое время, когда возникает проблема с потоком STA, когда происходит вызов из другого потока.

enter image description here

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Вместо создания статического класса TaskProgress для наследования от DependencyObject вы должны реализовать в нем INotiifyPropertyChanged и вызвать событие PropertyChanged из установщика свойства Instance.

Это будет работать по двум причинам ...

  1. DependencyObject не зависит от потока и, следовательно, доступ к нему через какой-либо другой поток обязательно приведет к ошибке.

  2. INotifyPropertyChanged.PropertyChanged Событие внутренне делегировано диспетчеру пользовательского интерфейса с помощью инфраструктуры привязки WPF.Таким образом, простой myTaskProgress.Instance = value автоматически обновит пользовательский интерфейс независимо от того, из какого потока он был сделан.

Обратите внимание, что INotifyPropertyChanged как интерфейс, он не может быть реализован в статическом классе и не можетиметь статическое событие или статическое свойство.Вы должны иметь некоторый экземпляр TaskProgress (например, myTaskProgress выше), связанный с Label.

Дайте мне знать, если это поможет.

1 голос
/ 04 ноября 2011

В теме

Вы можете попробовать использовать этот код:

this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() =>
{
    // your code to update UI here.
}
));
0 голосов
/ 04 ноября 2011

Я думаю, что правильный код должен быть:

public string lblProgressBarProducts
    {
        get { return (string)GetValue(lblProgressBarProductsProperty); }
        set { SetValue(lblProgressBarProductsProperty, value); }
    }

    // Using a DependencyProperty as the backing store for lblProgressBarProducts.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty lblProgressBarProductsProperty =
        DependencyProperty.Register("lblProgressBarProducts", typeof(string), typeof(TaskProgress), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...