为什么TextBlock.Text没有;我第一次(两次)设置内容时没有更新吗?以及如何解决/解决它
本文关键字:解决 更新 何解决 没有 Text TextBlock 第一次 两次 为什么 设置 | 更新日期: 2023-09-27 18:21:56
Clipboard.SetText(...)
经常在我的GUI中造成相当大的延迟。"暂时搁置";"正确编程/设计";,我想告诉用户稍等(第#01
行),然后让他/她知道是成功还是失败(第#06
行和第#10
行)。问题是,我从未看到"Copying..."
文本(第#01
行):
01| CopiedToClipboardTextBlock.Text = "Copying...";
02| try
03| {
04| // May cause considerable delay and GUI-freeze for a while...
05| Clipboard.SetText(textBlockContent);
06| CopiedToClipboardTextBlock.Text = "Copied to clipboard:'n" + textBlockContent;
07| }
08| catch (Exception e)
09| {
10| CopiedToClipboardTextBlock.Text = "Failed to copy to clipboard!";
11| }
所以我想——好吧,也许GUI只有在事件处理程序返回时才会更新(这对我来说没有意义…),所以我尝试了很多方法,其中包括:
- 用CCD_ 7做CCD_。没有帮助
- 在新线程中使用
Dispatcher.Invoke
的新线程(不要启动事件…我知道这很愚蠢…我很绝望)
(顺便说一句,Clipboard.SetText(...)
中的延迟发生在它即将失败的时候。失败是COMException: OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))
,在许多情况下几乎是不可避免的,但这不是这里的主要问题…)
更新:
这是我的变通方法:
CopiedToClipboardTextBlock.Text = "Copying...";
Exception resultException = null;
await Task.Run(() =>
{
var t = new Thread(obj =>
{
try { Clipboard.SetText(textBlockContent); }
catch (COMException e) { resultException = e; }
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
});
if (resultException == null)
CopiedToClipboardTextBlock.Text = "Copied to clipboard:'n" + textBlockContent;
else
CopiedToClipboardTextBlock.Text = "Failed to copy to clipboard!";
内部Thread
是由于Clipboard.SetText(...)
功能要求具有STA
。
我不知道,对我来说似乎很冗长。我怀疑有一个更简单的解决方案。
是的,GUI只有在事件处理程序返回时才会更新(因为事件处理程序是在负责GUI更新的UI线程内部调用的)。要在长操作之前更新文本,您应该在后台线程中调用该操作。所以事件处理程序将被释放,GUI将被刷新。
尝试设置剪贴板文本如下:
await Task.Run(() => Clipboard.SetText(textBlockContent));