Windows运行时中的无意多线程

时间:2015-01-17 22:21:56

标签: c# windows-runtime winrt-xaml

我正在使用保存设置的SettingsPane,我解决了所有问题 - 除了一件我显然无法控制的事情。

这是相关的SettingsPane.xaml:

<ComboBox Name="Themes" SelectionChanged="SettingSelectionChanged">
    <ComboBoxItem Content="Theme 1" />
    <ComboBoxItem Content="Theme 2" />
    <ComboBoxItem Content="Theme 3" />
</ComboBox>

这是我的SettingsPane.xaml.cs:

public Settings()
{
    this.InitializeComponent();
    this.DataContext = MainPage.Data;
    Themes.SelectedIndex = 0;
}

private void SettingSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ApplicationData.Current.RoamingSettings.Values["Theme"] = Themes.SelectedIndex;
    ApplicationData.Current.SignalDataChanged();
}

我处理MainPage.xaml.cs中的SignalDataChanged()调用:

public static MainPageVM Data = new MainPageVM();

public MainPage()
{
    Windows.Storage.ApplicationData.Current.DataChanged += (a, o) =>
    {
        Data.Theme = (int) Windows.Storage.ApplicationData.Current.RoamingSettings.Values["Theme"];
    };
}

Theme存储在MainPageVM.cs中:

private int _theme = 0;
public int Theme
{
    get { return _theme; }
    set
    {
        if (value == _theme) return;
        _theme = value;
        OnPropertyChanged();
    }
}

现在,这是这样绑定的:

<Grid Background="{Binding Theme, Converter={StaticResource ThemeToBackground}}" Name="MainGrid">

除了一件事,它似乎有效。当它在OnPropertyChanged()的setter中遇到Theme来电时,会因此错误而崩溃:

  

附加信息:该应用程序称为为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))

我该怎么办?

1 个答案:

答案 0 :(得分:1)

每个窗口都有一个与之关联的不同线程;如果涉及数据绑定,您应该避免从另一个页面引用一个页面的视图模型(您需要一个将更改推送到正确线程的适配器)。 [编辑]此外,在与任何页面无关的线程上引发该特定事件。