【问题标题】:ProgressBar in TreeViewItemTreeViewItem 中的进度条
【发布时间】:2018-01-13 11:11:38
【问题描述】:

我创建了一个包含 ProgressBar 的 TreeViewItem。

<DataTemplate>
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Height="35" MinWidth="100">
         <CheckBox Name="chk" IsChecked="True" Margin="2" Tag="{Binding}" Style="{DynamicResource myCheckBoxStyle}" />
         <TextBlock Text="{Binding}" Padding="0 10 0 10" Width="100" />
         <ProgressBar x:Name="tvProgressBar" HorizontalAlignment="Right" Width="300" Height="20" Foreground="#FF089ACE"  />
      </StackPanel>
</DataTemplate>

但我似乎无法更新进度条的值,我可以通过这样做找到进度条

ProgressBar pb = (System.Windows.Controls.ProgressBar)(tv.HeaderTemplate.LoadContent() as StackPanel).FindName("tvProgressBar");

但是当我更新进度条的值时,UI 没有更新。如果我在 TreeView 之外创建 ProgressBar,则会按预期进行更新,因此这似乎是我访问 TreeViewItem 中嵌入的 ProgressBar 或需要更新它的方式。

【问题讨论】:

  • 尝试使用MinValueMaxValue 属性的默认值,可能设置为MinValue=1MaxValue=100。无法准确回忆起属性名称是 MinValueMinimumValue
  • 最小值和最大值没有区别,谢谢
  • 您的进度条可能无法在视觉上更新的原因只有两个:1) 实际上,您没有实际更改了Value,或者2) 您正在尝试显示正在 UI 线程中执行的操作的进度。使用ProgressBar 的正确方法是在后台线程中运行长时间运行的操作(例如Task.Run()),并让该操作更新绑定到@ 的view model 属性987654333@ 财产。您没有发布可靠地重现问题的良好minimal reproducible example,因此无法实际回答问题。
  • 我相信我遇到的问题是模板中的进度条需要数据绑定到一个对象。我将进程配置为从另一个线程运行并在进度条上进行观察,我可以清楚地看到对象已使用我设置的值进行了更新,并且正在增加,但没有对 UI 进行更新。似乎 (System.Windows.Controls.ProgressBar)(tv.HeaderTemplate.LoadContent() as StackPanel).FindName("tvProgressBar") 不允许您更新对象。

标签: c# wpf treeviewitem


【解决方案1】:

您如何更新值?你有“等待”光标吗?如果是这样,您可能需要使用工作线程来运行 UI,以便进度条实际更新,而不仅仅是从 0 变为 100。

查看进度条控件上的这些链接:123

基本上,试试这个:

private readonly BackgroundWorker worker = new BackgroundWorker { WorkerReportsProgress = true };

public MainWindow()
{
    InitializeComponent();

    worker.DoWork += worker_DoWork;
    worker.ProgressChanged += worker_ProgressChanged;
}

private void worker_DoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    // Do some long process, break it up into a loop so you can periodically
    //  call worker.ReportProgress()

    worker.ReportProgress(i);  // Pass back some meaningful value
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    prgBar.Value = Math.Min(e.ProgressPercentage, 100);
}

【讨论】:

  • UI 是响应式的,不会冻结,进度条永远不会更新。我已经尝试在另一个线程中使用 dispatcher.BeingInvoke 但仍然遇到同样的问题。
  • 我尝试在 TreeViewItem 模板之外添加一个进度条,它按预期更新,因此它与模板中的内容有关。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多