2015-09-26 86 views
1

我知道這是回答,但我無法讓它工作。可有人是一種足以幫助我算出這個無法從非UI線程更新wpf控件

這是我的XAML類:

namespace Windamow 
{ 
/// <summary> 
/// Interaction logic for DynamoWindow.xaml 
/// </summary> 
public partial class DynamoWindow : Window 
{ 
    public DynamoWindow() 
    { 
     InitializeComponent(); 
    } 
    public void setBrowserURL(string URL) 
    { 
     browser.Source = new Uri(URL); 
    } 
    public void setBrowserFromString(string HTMLString) 
    { 
     browser.NavigateToString(HTMLString); 
    } 
} 
} 

我然後嘗試更新被顯示成這樣的HTML字符串:

namespace Windamow 
{ 
public class Windamow 
{ 

    private DynamoWindow window; 

    internal void ThreadProc() 
    { 
     window = new DynamoWindow(); 

     window.ShowDialog(); 
    } 

    internal Windamow() 
    { 
     Thread t = new Thread(ThreadProc); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

    public static DynamoWindow MakeWindow(bool launch, string html) 
    { 
     if (launch) 
     { 
      Windamow mow = new Windamow(); 

      var action = new Action(() => mow.window.setBrowserFromString(html)); 
      Application.Current.Dispatcher.BeginInvoke(
      DispatcherPriority.Input, 
      action); 

      return mow.window; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 
} 

XAML:

<Window x:Class="Windamow.DynamoWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <WebBrowser x:Name="browser" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
</Grid> 

錯誤消息:

調用線程無法訪問此對象,因爲不同的線程擁有它。

+0

哪裏相關的XAML? –

+0

@isi更新了問題。我的錯 – konrad

回答

1

問題就在這裏:

var action = new Action(() => mow.window.setBrowserFromString(html)); 

此代碼將嘗試而已經上創建並關聯到另一個線程從主UI線程訪問window對象,一個你自己創建的t

根據您的使用情況,你可以簡單地嘗試類似:

public DynamoWindow(string html) 
{ 
    InitializeComponent(); 

    setBrowserFromString(html); 
} 
... 
if (launch) 
{ 
    Windamow mow = new Windamow(html); 

    return mow.window; 
} 

(未經測試,但你的想法)