2011-04-07 83 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將被設計爲靈活地適應預期的數據模式。