为什么 TextBlock.Text 在我第一次(两次)设置其内容时没有更新?以及如何解决/解决它?



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只有在事件处理程序返回时才会更新(这对我来说没有意义…),所以我尝试了很多方法,其中包括:

  1. 用CCD_ 7做CCD_。没有帮助
  2. 在新线程中使用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));

最新更新