在 WPF 中,我有以下代码:
wrapPanel.Dispatcher.Invoke(new Action(() =>
{
wrapPanel.Children.Add(myCanvas);
}));
当我运行这个我得到
“调用线程无法访问此对象,因为不同的线程拥有它”
据我所知,打电话dispatcher.Invoke()
应该可以解决这个问题。
为什么我会收到此错误?这可能是什么原因?
由于我的实际代码太长,我没有在这里全部粘贴。顺便说一句,我是菜鸟。
在 WPF 中,我有以下代码:
wrapPanel.Dispatcher.Invoke(new Action(() =>
{
wrapPanel.Children.Add(myCanvas);
}));
当我运行这个我得到
“调用线程无法访问此对象,因为不同的线程拥有它”
据我所知,打电话dispatcher.Invoke()
应该可以解决这个问题。
为什么我会收到此错误?这可能是什么原因?
由于我的实际代码太长,我没有在这里全部粘贴。顺便说一句,我是菜鸟。
使用 WPF 时,我们使用由相关 UI 对象显示的数据对象。使用s,我们通过操作数据对象Binding
来更新 UI 。我会针对您的情况实施类似的方法...首先在您的绑定中创建一个:DependencyProperty
MainWindow.cs
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
"Items", typeof(ObservableCollection<Image>), typeof(MainWindow),
new UIPropertyMetadata(new ObservableCollection<Image>()));
public ObservableCollection<Image> Items
{
get { return (ObservableCollection<Image>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
然后添加将显示数据属性的 UI 代码:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
最后,我们必须设置DataContext
(这是最不推荐的方式,但对于本例来说是最简单的方式):
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
不需要任何Dispatcher.Invoke
调用来实现这一点。