- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我要进行长时间的操作,希望显示“扩展工具包”的繁忙状态指示器。我之前对此发表过一篇文章,它是固定的Wpf Extended toolkit BusyIndicator not showing during operation。但是,在该调用期间,我必须与UI元素( Canvas )进行交互,并且得到一个“调用线程必须是STA,因为许多UI组件都需要STA”。我了解(现在)有后台工作人员(请参见代码):
private void CboItemId_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BackgroundWorker _backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
_backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);
ItemSearchBusyIndicator.IsBusy = true;
// Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
if (RdoItemSearch.IsChecked == false) return;
///backgroundWorker_DoWork(null, null);
if (CboItemId.SelectedValue == null) return;
if (CboItemId.SelectedValue.ToString() != string.Empty)
{
selectedItem = CboItemId.SelectedValue.ToString();
_backgroundWorker.RunWorkerAsync();
}
// Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
}
public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
LoadItemData(selectedItem);
}
使用MTA,并且不能设置为STA。因此,我尝试调用在其自己的线程中使用UI元素的内部函数:
public void LoadItemData(string itemId)
{
Axapta ax = new Axapta();
files.Clear();
try
{
ax.Logon(Settings.Default.Server, null, Settings.Default.Test, null);
AxaptaContainer path = (AxaptaContainer)ax.CallStaticClassMethod(Settings.Default.ClassName, Settings.Default.ItemData, itemId);
for (int i = 1; i <= path.Count; i++)
{
AxaptaContainer somestring = (AxaptaContainer)path.get_Item(i);
for (int j = 1; j <= somestring.Count; j += 2)
{
string extension = Path.GetExtension(somestring.get_Item(j + 1).ToString().ToLower());
if (extension == ".jpg"
|| extension == ".jpeg"
|| extension == ".gif"
|| extension == ".png"
|| extension == ".bmp"
|| extension == ".pdf")
/* key=path - value=description */
files.Add(somestring.get_Item(j + 1).ToString(), somestring.get_Item(j).ToString());
}
}
// _canvas.Children.Clear();
Thread t = new Thread(new ThreadStart(LoadPictures));
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
ax.Logoff();
}
}
这是我与canvas元素进行交互的地方:
private void LoadPictures()
{
foreach (DictionaryEntry filePath in files)
{
try
{
Picture p = new Picture();
ToolTip t = new ToolTip();
t.Content = filePath.Value;
p.ToolTip = t;
TextBlock tb = new TextBlock();
tb.Text = filePath.Value.ToString();
Canvas.SetTop(tb, y);
Canvas.SetLeft(tb, x);
p.ImagePath = filePath.Key.ToString();
p.OriginalImagePath = filePath.Key.ToString();
p.ImageName = filePath.Value.ToString();
_canvas.Children.Add(p); //<-------This is where i seem to error
}
catch (Exception ex)
{
MessageBox.Show("Error:" + ex.Message,"File Load Error",MessageBoxButton.OK,MessageBoxImage.Error);
}
}
}
但我收到“调用线程无法访问该对象,因为其他线程拥有它”
最佳答案
有多种方法:
1)Async binding,不建议使用,但它在那里。您可以在属性getter中运行长时间运行的任务,完成后,框架将阻止UI阻塞-UI将得到更新。
2)使用BackgroundWorker
或Task
/Thread
运行代码,但将其调用到UI线程中。在您的示例中:
Dispatcher.InvokeAsync(() => _canvas.Children.Add(p));
var thread = new Thread(() =>
{
var window = new SomeWindow();
window.ShowDialog();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
关于c# - 在STA线程上显示忙碌指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397022/
Azure 让我头疼。 我从教程开始。创建了一个新的 MVC 3 项目并将其发布。大约花了 9 分钟,然后它在我的生产虚拟机上运行良好。 然后我尝试发布一个我一直在从事的项目(MVC 3)。它具有以下
我正在尝试使用 C#/.NET 4.0 自动化外部应用程序的 GUI 被自动化 (AUT) 的应用程序是一个 VB6 应用程序。 在执行操作或单击按钮时,AUT 有时会花费大量时间等待 DB 响应。当
在 Xcode 中,我遇到了一个用户问题,该问题导致我的应用程序开发停止,因为 UI 变得难以管理。 Storyboard中充斥着不同的对象和其他点点滴滴。 当我开发我的第一个应用程序时,我发现 St
我正在尝试实现一个能够安排其他人进行约会的日历系统。系统必须能够防止在另一个约会期间或在他们不可用的时间安排一个人。 我查看了我在互联网上找到的所有现有的 django 日历项目,但似乎没有一个内置了
有什么方法可以将虚拟机角色实例的状态从繁忙更改为就绪。如果可能的话,我想用 wcf 服务来做到这一点。非常感谢。 最佳答案 Fabric Controller 将定期检查实例的状态,这样做时您将能够让
您如何更改您的状态以显示 dnd/away 等? XMPPPresence *presence = [XMPPPresence presenceWithType:status]; [[[self ap
我向 Outlook 发送了一条 vCalendar 消息,这会在 Outlook 日历中产生一个新事件。 如何设置“显示为”字段? (空闲/忙碌/暂定/不在办公室) 最佳答案 我在 Outlook
我一直在使用 Google Calendar API,并试图找出如何判断日历事件是否应被视为阻塞时间的事件。例如,“哥伦布日”是美国许多人的全天事件(假期),对他们的工作日没有影响,但会出现在日历上。
我有一个用于预订房间的 GAS 网络应用程序。当应用程序创建事件时,它当前默认为事件“忙碌”。我正在尝试将默认设置为“免费”。 我找到了一个 GAS 论坛条目,该条目建议使用 Advanced Goo
我有一个正在运行的 WCF 服务和辅助角色,我一直在 Azure Development Fabric 上进行本地调试。一切都很好,但现在我尝试将其部署到临时环境中的云中,我发现了一些奇怪的问题。 我
在我的 Google 日历中,我有连续的事件: 事件 1 上午 9 点 - 上午 11 点 事件 2 上午 11 点至下午 13 点 事件 3 下午 13 点至 15 点 当我查询 Freebusy
我使用的是 Spin 控件的“Angularised”版本,如此处所述:http://blog.xvitcoder.com/adding-a-weel-progress-indicator-to-yo
我是一名优秀的程序员,十分优秀!