从后面的页面代码更改 UserControl 的内容

拉维库马尔

所以我有一个用户控件:

<StackPanel Orientation="Vertical"
                Margin="10">
        <StackPanel Orientation="Horizontal"
                    HorizontalAlignment="Stretch"
                    Margin="10">
            <TextBlock Text="{x:Bind FileName, Mode=OneTime}"
                       HorizontalAlignment="Left"/>
            <TextBlock Text="{x:Bind DownloadSpeed, Mode=OneWay}" 
                       HorizontalAlignment="Right"/>
        </StackPanel>

        <ProgressBar Name="PbDownload"
                     HorizontalAlignment="Stretch" />

        <TextBlock Text="{x:Bind DownloadCompletePercent, Mode=OneWay}"/>

    </StackPanel>

背后的用户控制代码:

public sealed partial class UCDownloadCard : UserControl
    {
        public UCDownloadCard()
        {
            this.InitializeComponent();
        }

        public string FileName { get; set; }
        public string DownloadSpeed { get; set; }
        public string DownloadCompletePercent { get; set; }
    }

我想要做的是使用此用户控件显示文件下载状态。每当开始新的下载时,我都想以编程方式添加一个新的用户控件,然后在下载时更新其中的值。

目前我正在做这样的事情:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    public CancellationTokenSource CancellationTokenSource { get; set; }
    public List<DownloadOperation> ActiveDownloads { get; set; } = new List<DownloadOperation>();
    public List<UCDownloadCard> AddedCards { get; set; } = new List<UCDownloadCard>();


    private async Task HandleDownloadAsync(DownloadOperation downloadOperation, CancellationToken cancellationToken = new CancellationToken())
    {
        ActiveDownloads.Add(downloadOperation);
        ...
        ...

        try
        {
            AddDownloadProgressCard();
            await downloadOperation.StartAsync().AsTask(CancellationTokenSource.Token, progressCallback);                
        }

        finally
        {
            ...
            ...
        }
    }

    private void AddDownloadProgressCard()
    {
        var card = new UCDownloadCard
        {
            Name = $"Card{AddedCards.Count}",
            FileName = "Filename.pdf",
            DownloadCompletePercent = "0% completed",
            DownloadSpeed = "0 KB/s"
        };

        AddedCards.Add(card);
        OutputArea.Children.Add(card);
    }

    private void DownloadProgressChanged(DownloadOperation downloadOperation)
    {   
        var downloadPercent = 100 * ((double)downloadOperation.Progress.BytesReceived / (double)downloadOperation.Progress.TotalBytesToReceive);
        this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
        {
            AddedCards[0].DownloadCompletePercent = downloadPercent.ToString();
            Debug.WriteLine($"Updating Progress: {downloadPercent}%");
        });

    }    
}

我可以将 UserControl 添加到,OutputArea但其中的值没有更新。但我确信它AddedCards[0].DownloadCompletePercent = downloadPercent.ToString();被多次执行,因为它Debug.WritLine正下方的实际上正在打印到输出窗口。

如何更新 UserControl 中的值?

刘微风 - MSFT

首先,你应该改变你的用户控件与X:绑定Mode=TwoWay。见{X:}绑定标记扩展的更多细节。

然后您应该实现INotifyPropertyChanged接口并实现PropertyChanged事件。您可以参考PropertyChanged事件的代码

这是一个简单的示例,您可以参考。

用户控件.xaml,

<StackPanel Orientation="Vertical"
            Margin="10">
    <StackPanel Orientation="Horizontal"
                HorizontalAlignment="Stretch"
                Margin="10">
    <TextBlock Text="{x:Bind DownloadCompletePercent, Mode=TwoWay}"/>
</StackPanel>

用户控件.xaml.cs,

public sealed partial class UCDownloadCard : UserControl, INotifyPropertyChanged
    {
        public UCDownloadCard()
        {
            this.InitializeComponent();
        }
        private string downloadCompletePercent;
        public string DownloadCompletePercent
        {
            get
            {
                return downloadCompletePercent;
            }
            set
            {
                downloadCompletePercent = value;
                RaisePropertyChanged("DownloadCompletePercent");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void RaisePropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }

然后你可以添加这个 UserControl 并更新它的downloadCompletePercent

在 MainPage.xaml.cs 中,

private void DownloadProgress(DownloadOperation obj)
{
    BackgroundDownloadProgress currentProgress = obj.Progress;
    double percent;
    if (currentProgress.TotalBytesToReceive > 0)
    {
        percent = currentProgress.BytesReceived * 100 / currentProgress.TotalBytesToReceive;
        Debug.WriteLine(percent);
        uCDownloadCard.DownloadCompletePercent = percent.ToString();
    }
}

UCDownloadCard uCDownloadCard;
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    uCDownloadCard = new UCDownloadCard();
    MainPagePanel.Children.Add(uCDownloadCard);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从 UserControl 动态更改 WPF 窗口中的内容

来自分类Dev

删除后面的UserControl代码以用于MVVM

来自分类Dev

在页面初始化期间从父代后面的代码设置UserControl的属性

来自分类Dev

UserControl 内容未更新

来自分类Dev

从后面的代码访问formView内部的userControl页脚模板

来自分类Dev

代码后面的UserControl变得非常大

来自分类Dev

WPF视图-UserControl路径,而不是UserControl内容

来自分类Dev

如何获取整个页面的更改内容

来自分类Dev

在Angularjs中更改iframed页面的内容

来自分类Dev

使用锚点更改页面的内容

来自分类Dev

如何更改页面的全部内容

来自分类Dev

从wordpress插件更改页面的内容

来自分类Dev

使用锚点更改页面的内容

来自分类Dev

从网站后面的代码中读取一些内容

来自分类Dev

使用WPF / MVVM在运行时动态更改UserControl内容

来自分类Dev

如何从UserControl的代码后面显示Telerik RadWindow

来自分类Dev

背景颜色阻碍WPF UserControl内容

来自分类Dev

如何防止UserControl的内容被覆盖?

来自分类Dev

背景颜色阻碍WPF UserControl内容

来自分类Dev

TabBar 后面的 TableView 内容

来自分类Dev

布局页面的代码未发送到内容页面

来自分类Dev

Dokuwiki-如何动态更改可见页面的内容

来自分类Dev

如何使用<select onChange>元素更改页面的内容?

来自分类Dev

根据导航栏上的选项更改 HTML 页面的内容

来自分类Dev

从后面的代码添加到内容中时,WebView不可见

来自分类Dev

自封标签后面的玉内容

来自分类Dev

模态后面的模糊 HTML 内容

来自分类Dev

停止模态窗口滚动后面的内容

来自分类Dev

ASPX页面的动态内容