UWP - TextBlock.Text不会更新事件更改的每次更改值

时间:2016-07-18 10:25:02

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

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

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

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

问题:我接近这个完全错误,还是我需要做相当于textbox.Refresh()? (如果我这样做,我会感到惊讶,.Refresh()似乎有点像1990年代)

FYI ,我使用的另一种方法是更新逻辑中的'status'属性,并让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();
   }
}

1 个答案:

答案 0 :(得分:1)

  

我接近这个完全错误,还是我需要做相当于textbox.Refresh()? (如果我这样做,我会感到惊讶,.Refresh()似乎有点像1990年代)

啊......不,如果每次更改值时都需要更新TextBlock.Text,我们建议使用数据绑定和INotifyPropertyChanged interface的实现。您可以搜索大量样本。

  

我有一个用户启动的操作,我对集合中的每个项目执行操作。我想在发生这种情况时随时通知用户进度。

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

任何方式,你需要的是Data binding在UWP,因为我不确定你想要达到什么,我没有在这里写一个演示,如果你有任何问题,你可以发表评论。

顺便说一下,你的意思是“我的UWP代码工作正常,除了它只显示最后一个动作的'状态',而不是前面的动作。”?