关于【调用线程必须为 STA,因为许多 UI 组件都需要】的问题 实在不知道怎么改了 贴出代码麻烦大神给改一下吧!
【背景介绍】:在网上下载了一个Html to RTF的源码,涉及到WPF。我的程序是winform在winform一个线程中调用如下代码
string a = HtmlToRtfConverter.ConvertHtmlToRtf(tvalue);
ConvertHtmlToRtf相关代码如下
public static string ConvertHtmlToRtf(string htmlText)
{
var xamlText = HtmlToXamlConverter.ConvertHtmlToXaml(htmlText, false);
return ConvertXamlToRtf(xamlText);
}
private static string ConvertXamlToRtf(string xamlText)
{
var richTextBox = new RichTextBox();//运行时此处报错,调用线程必须为 STA,因为许多 UI 组件都需要。
if (string.IsNullOrEmpty(xamlText)) return "";
var textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
//Create a MemoryStream of the xaml content
using (var xamlMemoryStream = new MemoryStream())
{
using (var xamlStreamWriter = new StreamWriter(xamlMemoryStream))
{
xamlStreamWriter.Write(xamlText);
xamlStreamWriter.Flush();
xamlMemoryStream.Seek(0, SeekOrigin.Begin);
//Load the MemoryStream into TextRange ranging from start to end of RichTextBox.
textRange.Load(xamlMemoryStream, DataFormats.Xaml);
}
}
using (var rtfMemoryStream = new MemoryStream())
{
textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
textRange.Save(rtfMemoryStream, DataFormats.Rtf);
rtfMemoryStream.Seek(0, SeekOrigin.Begin);
using (var rtfStreamReader = new StreamReader(rtfMemoryStream))
{
return rtfStreamReader.ReadToEnd();
}
}
}
运行时提示 调用线程必须为 STA,因为许多 UI 组件都需要。
在网上搜了这个问题是WPF的多线程的问题,可是对多线程了解的实在是太少,试了很长时间还是没解决这个问题。
麻烦各位帮忙看下怎么修改呢? WPF 多线程 UI --------------------编程问答-------------------- https://www.google.com.hk/search?q=wpf+dispatcher.begininvoke&aq=0&oq=wpf+dispatcher.begini&aqs=chrome.1.57j0l3j62l2.8428j0&sourceid=chrome&ie=UTF-8 --------------------编程问答-------------------- 在你的线程方法需要更新界面或者打开心窗体的时候Application.Current.Dispatcher.BeginInvoke里执行下更新的代码就好 --------------------编程问答--------------------
--------------------编程问答--------------------
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread] //此处看你程序是不是STAThread的
static void Main()
{
是多线程调用的,主程序入口肯定是这个了 --------------------编程问答-------------------- 通过委托回调来创建和使用RichTextBox即可。1楼告诉你方法了。 --------------------编程问答-------------------- winform用invoke或者beginInvoke
补充:.NET技术 , C#