我使用XslCompiledTransform
将XML文件转换为HTML。
XML文件不是那么短,所以转换浪费了很多时间。
我的代码:
xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
所以我想使用未绑定到表单的进度条或(更好)进度图标(对话框?)。
问题在于我有两种形式。 第一个项目有一个项目列表和一个按钮,当选择项目并按下按钮时,显示第二个表格(非模态),XML文件转换,并在WebBrowser控件中显示。
在第二种形式构造函数中,我调用XslCompiledTransform.Load
,初始化控件,然后调用XslCompiledTransform.Transform()
。
在第二种形式中,我还有按钮在第一个表单列表项之间导航。所以,当我按下'>'然后选择第一种形式的下一个元素,重新加载第二种形式的元素 - 例如更改了一些文本,并再次为新的XML文件调用XslCompiledTransform.Transform()。
那么,每次加载第二张表格时如何组织进度条?
从第一表格:
private void OpenSecondForm()
{
if (formTwo == null)
{
formTwo = new FormTwo(this, culture, params);
formTwo .Show();
}
else
{
if (formTwo .IsDisposed)
{
formTwo = new FormTwo(this, culture, params);
formTwo .Show();
}
else
{
formTwo .Reinitialaze(culture, invoice);
}
formTwo .BringToFront();
}
}
public void SelectRow(int moveTo)
{
try
{
/*navigate on list here */
/* ... */
OpenSecondForm();
}
catch (Exception e)
{ MessageBox.Show(e.Message, "ERROR"); }
}
第二种形式:
public FormTwo(Form parent, CultureInfo cultr, string params)
{
culture = cultr;
parentForm = parent;
rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
InitializeComponent();
xslTransform = new XslCompiledTransform();
xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);
ReInitialazeAll();
}
internal void Reinitialaze(CultureInfo cultr, string params)
{
culture = cultr;
ReInitialazeAll();
}
private void ReInitialazeAll()
{
SelectDatabaseData();
InitCaptions();
InitForms();
}
private void InitForms()
{
EnableDisableButtons();
webBrowser1.DocumentText = "<HTML><BODY></BODY></HTML>";
FillXmlData();
}
private void FillXmlData()
{
xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
}
我试图创建一个线程来执行这些FillXmlData。但是当xml正在转换时,我的表单仍无法访问。
答案 0 :(得分:1)
您需要在单独的线程上运行XML转换(以及任何其他冗长的非UI加载操作)。像这样:
public FormTwo(Form parent, CultureInfo cultr, string params)
{
culture = cultr;
parentForm = parent;
rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
InitializeComponent();
// Show the progress bar
this.ProgressBar.Visible = true;
// Load on another thread
Thread loadingThread = new Thread(new ThreadStart(TransformXml));
loadingThread.Start();
}
private void TransformXml()
{
xslTransform = new XslCompiledTransform();
xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);
ReInitialazeAll();
}
注意:这假定您的进度条名为ProgressBar
。
但是,您需要注意,您无法访问另一个线程上的UI元素,因此需要在UI线程上调用ReInitialazeAll()
(包含拼写错误)。这可以通过以下方式安全地完成:
private void ReInitialazeAll()
{
// Make sure we're running on the UI thread
if (this.InvokeRequired)
{
BeginInvoke(new Action(ReInitialazeAll));
return;
}
// Hide the progress bar
this.ProgressBar.Visible = false;
// ... execute UI-related code
}
这应该给你一个足够好的开始,你可以工作。