WPF Calling thread Ошибка доступа к объекту - PullRequest
0 голосов
/ 04 июня 2018

Получение вызывающего потока Ошибка доступа к объекту.Рассматривал решения, но не могу понять, что это правильно.Строки ButtonPark и LabelState выдают ошибку.Любая помощь приветствуется.

public static class TelescopeHardware
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;
    private static void OnStaticPropertyChanged(string propertyName)
    {
        var handler = StaticPropertyChanged;
        handler?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }
}
public partial class MainWindow
{
        private void Window_Load(object sender, RoutedEventArgs e)
        {
        TelescopeHardware.StaticPropertyChanged += PropertyChanged;
    }
    private void PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
        case "SiderealTime":
            TextLst.Text = _util.HoursToHMS(TelescopeHardware.SiderealTime);
            break;
        case "RightAscension":
            TextRa.Text = _util.HoursToHMS(TelescopeHardware.RightAscension);
            break;
        case "Declination":
            TextDec.Text = _util.HoursToHMS(TelescopeHardware.Declination);
            break;
        case "AtPark":
            ButtonPark.Content = TelescopeHardware.AtPark ? @"UnPark" : @"Park";
            LabelState(TextParked, TelescopeHardware.AtPark);
            break;
                }
            }
    }
    private void LabelState(TextBlock text, bool state)
    {
        var brush = state ? new SolidColorBrush(Colors.GreenYellow) : new SolidColorBrush(Colors.DimGray);
        text.Foreground = brush;
    }
}

1 Ответ

0 голосов
/ 04 июня 2018

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

private void PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    this.Dispatcher.BeginInvoke((Action)(()=>
    {
        switch (e.PropertyName)
        {
            case "SiderealTime":
                TextLst.Text = _util.HoursToHMS(TelescopeHardware.SiderealTime);
                break;
            case "RightAscension":
                TextRa.Text = _util.HoursToHMS(TelescopeHardware.RightAscension);
                break;
            case "Declination":
                TextDec.Text = _util.HoursToHMS(TelescopeHardware.Declination);
                break;
            case "AtPark":
                ButtonPark.Content = TelescopeHardware.AtPark ? @"UnPark" : @"Park";
                LabelState(TextParked, TelescopeHardware.AtPark);
                break;
        }
    }));
}
...