首页 > 解决方案 > 从文本框后面的代码实时递增计数器

问题描述

我有一个 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握着我的手!

标签: c#wpfxaml

解决方案


实现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);
    }
} 

推荐阅读