c# - 从文本框后面的代码实时递增计数器
问题描述
我有一个 WPF 应用程序,它通过数据在 Codebehind 中循环,并为每个找到的元素增加一个计数器。
现在我想显示实时递增计数器作为状态反馈给用户。
我现在得到的只是任务完成后的值,因为我们需要将它作为等待任务运行。
按钮单击触发循环我的数据的方法。
如果我的方法运行而不是在完成之后,我可以更新我的 Xaml 中的计数器吗?
解决方案 mm8:
代码背后:
public partial class UserControlCounter : UserControl, INotifyPropertyChanged
{
private int _scanStatusCounter;
public int ScanStatusCounter
{
get { return _scanStatusCounter; }
set { _scanStatusCounter = value; NotifyPropertyChanged(); }
}
public UserControlCounter()
{
InitializeComponent();
DataContext = this;
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Run(getAll);
scanStatus.Text = "Persons " + ScanStatusCounter.ToString();
}
private async void getAll()
{
//grab data and iterate it
string[] string_array = new string[] { "a", "b", "c", "d", "e" }; // type = System.String[]
foreach (var i in string_array)
{
ScanStatusCounter++;
await Task.Delay(100);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
那是我的控件 Xaml:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" x:Name="scanStatus" Text="{Binding Path=ScanStatusCounter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
<Button Grid.Row="0" Grid.Column="1" Click="Button_Click"> Click Me</Button>
</Grid>
谢谢你
添加了更新的工作解决方案。提前感谢mm8握着我的手!
解决方案
实现INotifyPropertyChanged
并创建scanStatusCounter
一个属性:
public partial class UserControlCounter : UserControl, INotifyPropertyChanged
{
private int _scanStatusCounter;
public int ScanStatusCounter
{
get { return _scanStatusCounter; }
set { _scanStatusCounter = value; NotifyPropertyChanged(); }
}
public UserControlCounter()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
var contentPresenter = (btn.TemplatedParent as ContentPresenter);
var ppStatusCounter = contentPresenter.ContentTemplate.FindName("scanStatus", contentPresenter) as TextBlock;
await Task.Run(getAll);
ppStatusCounter.Text = "Persons " + ScanStatusCounter.ToString();
}
private static async void getAll()
{
//grab data and iterate it
foreach (var result in data)
{
ScanStatusCounter++;
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
您可能还想在循环中添加一些延迟以实际能够看到计数器正在递增:
private static async void getAll()
{
//grab data and iterate it
foreach (var result in data)
{
ScanStatusCounter++;
await Task.Delay(100);
}
}
推荐阅读
- python - 查找形状文件中的所有相交多边形
- python - 无法在不返回 ValueError 的情况下 fit() Scikit-Learn 管道
- python-3.x - 连续硬币计数
- dafny - 如何使用“存在”量词?
- java - 错误:不兼容的类型:int 无法转换为 int[] 和其他错误
- python - 为什么在元组中使用 key ?以及这里的语法是什么
- jquery - 如何在单击图像链接时显示工具提示
- regex - .htaccess 文件中的操作顺序
- javascript - 如何使用javascript获取输入字段中的值以在sharepoint中编辑
- graphql - “'VoteCreateInput'类型的变量'$data'预期值”