这是工作代码(但在UI线程上):
<ContentControl
Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
Focusable="True"
HorizontalAlignment="Right"
Content="{Binding Work}" >
</ContentControl>
这是我尝试制作的代码,但它不起作用:(代码隐藏)
InitializeComponent();
var thread = new Thread(
() =>
{
var a = new ContentControl { Focusable = true, HorizontalAlignment = HorizontalAlignment.Right };
var binding = new Binding { Path = new PropertyPath("Work"), };
a.SetBinding(ContentProperty, binding);
MainGrid.Dispatcher.Invoke(new Action(() => { MainGrid.Children.Add(a); }));
}) { IsBackground = true };
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
我的目标是创建一个ConentControl
并将其放在网格中,该网格位于listview
内,其中包含多个ContentControls
。)显示的解决方案正在崩溃,因为另一个线程拥有MainGrid
。
有人对此有好的想法吗? (很想在另一个线程上执行它,因为ContentControl
很重,比如创建布局需要3秒。它是一个根据参数创建自己的通用视图。)
修改
主要问题是在创建这些视图期间,我的整个应用程序都会挂起。这是非常不受欢迎的。我的目标是将此工作负载转移到另一个(或多个)其他线程。
答案 0 :(得分:4)
您可以使用IsAsync
属性强制在不同的线程上执行绑定。
Content="{Binding Work, IsAsync=True}"
这将在新线程上执行与Work
的绑定,并在完成后填充内容。你不需要为代码隐藏的东西而烦恼。
你可以在行动here找到一个很好的教程。