【发布时间】: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 或需要更新它的方式。
【问题讨论】:
-
尝试使用
MinValue和MaxValue属性的默认值,可能设置为MinValue=1、MaxValue=100。无法准确回忆起属性名称是MinValue或MinimumValue。 -
最小值和最大值没有区别,谢谢
-
您的进度条可能无法在视觉上更新的原因只有两个: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