[英]cannot update wpf control from non UI thread
我知道已經回答了,但我無法使它正常工作。 有人可以幫助我解決這個問題嗎
這是我的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>
錯誤信息:
調用線程無法訪問該對象,因為其他線程擁有它。
問題在這里:
var action = new Action(() => mow.window.setBrowserFromString(html));
這段代碼將嘗試從主UI線程訪問window
對象,而該window
對象已在另一個線程上創建並關聯到另一個線程,即您自己創建的t
。
根據您的用例,您可以簡單地嘗試如下操作:
public DynamoWindow(string html)
{
InitializeComponent();
setBrowserFromString(html);
}
...
if (launch)
{
Windamow mow = new Windamow(html);
return mow.window;
}
(未經測試,但您知道了)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.