UWP - TextBlock.Text 每次值被事件改变时不更新
UWP - TextBlock.Text not updating everytime value changed by event
我有点不知道怎么问这个问题。
更新 - 现在包含代码示例。
我正在构建一个 'for fun' UWP 应用程序;我有一个用户启动的操作,我在其中对集合中的每个项目执行操作。我想在发生这种情况时让用户了解进度。
过去对我有用的一种方法 (Winforms) 是每次我处理一个项目时触发一个事件,并更新(例如)文本框的文本。我的 UWP 代码工作正常,只是它只显示最后一个操作的 'status',而不显示前面的操作。
问题: 我的做法是完全错误的,还是我需要做与 textbox.Refresh() 等效的事情? (如果我这样做我会感到惊讶,.Refresh() 看起来有点 1990 年代)
仅供参考,我使用的另一种方法是更新逻辑中的 'status' 属性,并让 UI 运行 一个计时器,它轮询当前状态的逻辑(即显示某个时间点的状态,而不是逻辑内的事件)。我还没有时间在任何 UWP 应用程序中尝试这个。
我很高兴得知第二种方法是 'better',但我还特别想了解更多有关第一种方法不起作用的原因。
首先是处理繁重工作的 class:
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();
}
}
Am I approaching this entirely wrong, or do I need to do the equivalent of textbox.Refresh() ? (I'd be surprised if I do, .Refresh() seems a little 1990's)
啊...不对,如果每次值变化都需要更新TextBlock.Text
,我们建议使用数据绑定,配合INotifyPropertyChanged interface的实现。有很多示例,您可以搜索它们。
I have a user initiated operation where I perform an action on each item in a collection. I want to keep the user informed of progress as this happens.
我没有发现您发布的任何代码与集合相关,我只是想知道您是否真的使用 ListView or GridView to show all the items in this collection, and you want change the text of TextBlock
in each ListViewItem
/ GridViewItem
. If so, you can refer to the official ListView and GridView sample 来了解它们如何处理集合和数据绑定。
总之,你需要的是UWP中的Data binding,因为我不确定你想要实现什么,我没有在这里写一个demo,如果你有任何问题,可以离开一条评论。
顺便问一下,"My UWP code works OK except that it only shows the 'status' of the last action, and not the preceding ones." 是什么意思?
我有点不知道怎么问这个问题。
更新 - 现在包含代码示例。
我正在构建一个 'for fun' UWP 应用程序;我有一个用户启动的操作,我在其中对集合中的每个项目执行操作。我想在发生这种情况时让用户了解进度。
过去对我有用的一种方法 (Winforms) 是每次我处理一个项目时触发一个事件,并更新(例如)文本框的文本。我的 UWP 代码工作正常,只是它只显示最后一个操作的 'status',而不显示前面的操作。
问题: 我的做法是完全错误的,还是我需要做与 textbox.Refresh() 等效的事情? (如果我这样做我会感到惊讶,.Refresh() 看起来有点 1990 年代)
仅供参考,我使用的另一种方法是更新逻辑中的 'status' 属性,并让 UI 运行 一个计时器,它轮询当前状态的逻辑(即显示某个时间点的状态,而不是逻辑内的事件)。我还没有时间在任何 UWP 应用程序中尝试这个。
我很高兴得知第二种方法是 'better',但我还特别想了解更多有关第一种方法不起作用的原因。
首先是处理繁重工作的 class:
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();
}
}
Am I approaching this entirely wrong, or do I need to do the equivalent of textbox.Refresh() ? (I'd be surprised if I do, .Refresh() seems a little 1990's)
啊...不对,如果每次值变化都需要更新TextBlock.Text
,我们建议使用数据绑定,配合INotifyPropertyChanged interface的实现。有很多示例,您可以搜索它们。
I have a user initiated operation where I perform an action on each item in a collection. I want to keep the user informed of progress as this happens.
我没有发现您发布的任何代码与集合相关,我只是想知道您是否真的使用 ListView or GridView to show all the items in this collection, and you want change the text of TextBlock
in each ListViewItem
/ GridViewItem
. If so, you can refer to the official ListView and GridView sample 来了解它们如何处理集合和数据绑定。
总之,你需要的是UWP中的Data binding,因为我不确定你想要实现什么,我没有在这里写一个demo,如果你有任何问题,可以离开一条评论。
顺便问一下,"My UWP code works OK except that it only shows the 'status' of the last action, and not the preceding ones." 是什么意思?