我有点不确定如何提出这个问题 更新 - 现已包含代码示例。
我正在构建一个“有趣”的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();
}
}
答案 0 :(得分:1)
我接近这个完全错误,还是我需要做相当于textbox.Refresh()? (如果我这样做,我会感到惊讶,.Refresh()似乎有点像1990年代)
啊......不,如果每次更改值时都需要更新TextBlock.Text
,我们建议使用数据绑定和INotifyPropertyChanged interface的实现。您可以搜索大量样本。
我有一个用户启动的操作,我对集合中的每个项目执行操作。我想在发生这种情况时随时通知用户进度。
我没有发现您发布的任何代码与集合相关,我只是想知道您是否真的使用ListView or GridView来显示此集合中的所有项目,并且您想要更改{{1每个TextBlock
/ ListViewItem
中。}如果是这样,您可以参考官方ListView and GridView sample,了解它们如何与收集和数据绑定一起使用。
任何方式,你需要的是Data binding在UWP,因为我不确定你想要达到什么,我没有在这里写一个演示,如果你有任何问题,你可以发表评论。
顺便说一下,你的意思是“我的UWP代码工作正常,除了它只显示最后一个动作的'状态',而不是前面的动作。”?