【问题标题】:UWP - TextBlock.Text not updating everytime value changed by eventUWP - TextBlock.Text 不更新每次事件更改的值
【发布时间】:2016-07-18 10:25:01
【问题描述】:

我有点不确定如何提出这个问题。
更新 - 现已包含代码示例。

我正在构建一个“有趣”的 UWP 应用程序;我有一个用户启动的操作,我对集合中的每个项目执行操作。我希望在发生这种情况时让用户了解进度。

过去对我有用的一种方法(Winforms)是每次我处理一个项目时触发一个事件,并更新(例如)文本框的文本。我的 UWP 代码工作正常,只是它只显示最后一个操作的“状态”,而不是前面的。

问题:我是不是完全错误地处理了这个问题,还是我需要做相当于 textbox.Refresh() 的事情? (如果我这样做,我会感到惊讶,.Refresh() 似乎有点 1990 年代)

仅供参考,我使用的另一种方法是更新逻辑中的“状态”属性,并让 UI 运行一个计时器来轮询当前状态的逻辑(即在时间点而不是逻辑内的事件)。我只是还没有时间在任何 UWP 应用中尝试这个。

我很高兴被告知第二种方式“更好”,但我也特别想了解更多关于为什么第一种方式不起作用的更多信息。

首先有一个处理繁重的类:

public class Enigma1Device : IEnigmaDevice
{
    public event CharacterEnciphered OnCharacterEnciphered;

    public string TypeMessage(string message)
    {
        StringBuilder output = new StringBuilder();
        char[] chars = message.ToCharArray();
        char temp;

        if (OnCharacterEnciphered != null)
        {
            for (int c = 0; c < chars.Length; c++)
            {
                if (ValidInput(chars[c]))
                {
                    temp = ProcessLetter(chars[c], c + 1);
                    output.Append(temp);
                    OnCharacterEnciphered(temp);
                }
            }
        }
        else
        {
            ...
        }

        return output.ToString();
    }
}

以及调用它的 XAML 页面:

public sealed partial class Enigma1Page : Page
{
   public Enigma1Device EnigmaDevice;

   private void Page_Loaded(object sender, RoutedEventArgs e)
   {
      EnigmaDevice = new Enigma1Device();
      EnigmaDevice.OnCharacterEnciphered += EnigmaDevice_OnCharacterEnciphered;
   }

   private void stdEnigmaKeyboard_OnHereIsSomeTextToEncipher(string plaintext)
   {
      txtOutput.Text = EnigmaDevice.TypeMessage(plaintext);
   }

   private void EnigmaDevice_OnCharacterEnciphered(char l)
   {
      txtStatus.Text = l.ToString();
   }
}

【问题讨论】:

  • 如果您不显示您所做的任何代码,我们将无法提供帮助,最好是 mvce。同样重要的是要知道你是在做纯代码还是任何形式的绑定(mvvm)
  • Ehhh 如果没有代码,我们如何告诉您您是否正确接近,哈哈
  • 是的,有点废话 - 现在提供了一些代码。

标签: user-interface event-handling uwp auto-update


【解决方案1】:

我是不是完全错误地处理了这个问题,还是我需要做相当于 textbox.Refresh() 的事情? (如果我这样做,我会感到惊讶,.Refresh() 似乎有点 1990 年代)

啊...不,如果每次更改值都需要更新TextBlock.Text,我们建议使用数据绑定并实现INotifyPropertyChanged interface。有很多示例您可以搜索它们。

我有一个用户启动的操作,我对集合中的每个项目执行操作。我希望在发生这种情况时让用户了解进度。

我没有发现您发布的任何代码与集合相关,我只是想知道您是否真的使用ListView or GridView 来显示此集合中的所有项目,并且您想更改每个中的TextBlock 的文本ListViewItem/GridViewItem。如果是这样,您可以参考官方ListView and GridView sample 以了解它们如何处理收集和数据绑定。

无论如何,你需要的是UWP中的Data binding,由于我不确定你想要实现什么,所以我没有在这里写demo,如果你有任何问题,你可以发表评论。

顺便说一句,“我的 UWP 代码工作正常,只是它只显示最后一个操作的‘状态’,而不是前面的操作。”是什么意思?

【讨论】:

  • 谢谢。顺便说一句,“集合”是 Enigma1Device.TypeMessage() 中的 char 数组 - 我的意思是一般意义上的集合。
  • 在回答你的最后一句话/问题时,在遍历数组时,stdEnigmaKeyboard_OnHereIsSomeTextToEncipher() 只显示最后一个要处理的字符产生的数据,而不是前面的数据,例如'o' 但绝不是 h,e,l,l。
  • @AdrianK,你想显示每个加密字符的进度吗?为什么?我认为每个字符的进展可能是一个非常快速的动作,我个人更喜欢使用StringBuilder 输出整个加密字符串的第二种方法。
  • 是的,我已经展示了生成的字符串 - 但对于更长的字符串可能需要一些时间。我同意显示每个角色可能太快了,-“为什么”? - 我想看看我能不能让它工作。完成后,我可以尝试不同的方法来提供 UI 反馈。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2015-02-12
  • 2016-05-23
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多