2011-04-07 57 views
1

我想从运行在后台线程中的代码加载Xaml。 我知道我必须与调度员同步。但是,它失败(抛出异常)。 为什么?Xaml解析和多线程

下面是代码

public MainWindow() 
{ 
    InitializeComponent(); 
    Thread thread = new Thread(new ThreadStart(delegate 
        { 
         Dispatcher.Invoke(new Action(delegate 
         { 
          Content = XamlReader.Parse(
             "<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
               Content='Hello World'/>"); 
         })); 
        })); 
    thread.Start(); 
} 
+0

“失败”?怎么了 ? (可能没什么,因为o是在另一个线程中创建和销毁的)。 – 2011-04-07 18:35:14

回答

1

由于Pavlo mentioned,您还需要设置调度程序中与内容。

但是,我会说 - 这是相当无用的。请记住,当您调用Dispatcher.Invoke或BeginInvoke时,您明确表示要在UI线程上运行该代码。通过启动后台线程,该线程除了调用回UI线程外,什么都不做,你可以在UI线程上执行相同的工作,但缺点是系统会增加额外的开销以及更难的调试。在这种情况下,您应该直接加载文件。

0

这似乎是一个坏主意,因为几个原因。您是否期望从数据库或其他存储获取XAML片段,并且您无法在C#中创建这些控件的实例?你可以直接创建一个Button

您是否可以允许数据驱动您的可视化?一个很好的例子是有一组ICommand对象(CommandViewModel,RelayCommand等)和一个你想用来表示命令的CommandView?在这种情况下,它可能是一个<Button>,它与CommandViewModel Title或Content属性绑定。

你是后台线程,然后可以用来驱动数据(集合,属性)的人口,你的UI将被设计为灵活地适应预期的数据模式。