WPF 进度条不更新
WPF progress bar doesn't update
您好,我正在尝试设置一个带有一些文本和一个取消按钮的进度条,所以我使用了一个用户控件。我为此用户控件创建了属性(Min、Max、Value)以将它们传递给内部进度条。当我使用这些值初始化我的用户控件时,它会起作用,但是当我更新该值时,进度条不会移动。
有谁知道为什么?
当然,进度条所代表的工作是在单独的线程上完成的,并且值确实会更新并从 0 变为 100。
XAML
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<ProgressBar x:Name="progress_bar_internal" Minimum="{Binding Min}" Maximum="{Binding Max}" Value="{Binding Value}" Foreground="DarkGreen" Height="{Binding Height}" VerticalAlignment="Center"/>
<TextBlock Text="{Binding ElementName=progress_bar_internal, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</StackPanel>
<wpfui:Button Icon="PaneClose24" Grid.Column="1" VerticalAlignment="Center" Height="{Binding Height}" x:Name="cancel_btn" Background="DarkRed"/>
</Grid>
背后的代码
public partial class ProgressBar_w_Text : UserControl
{
public ProgressBar_w_Text()
{
InitializeComponent();
this.DataContext = this;
}
public event RoutedEventHandler Click
{
add { cancel_btn.AddHandler(ButtonBase.ClickEvent, value); }
remove { cancel_btn.RemoveHandler(ButtonBase.ClickEvent, value); }
}
public int Value { get; set; }
public int Max { get; set; }
public int Min { get; set; }
}
致电
<uc:ProgressBar_w_Text Visibility="Collapsed" x:Name="progress_bar" Height="50" Click="cancel_patcher" Min="0" Max="100" Value="15"/>
您应该将属性实现为 dependency properties 或实现 INotifyPropertyChanged
接口并在任何 属性 设置为新值时引发 PropertyChanged
事件。
如果您不执行上述任何操作,UI 就无法知道何时刷新。
这里是如何将 Value
作为依赖 属性 实现的示例:
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
nameof(Value), typeof(int), typeof(ProgressBar_w_Text));
public int Value
{
get => (int)GetValue(ValueProperty);
set => SetValue(ValueProperty, value);
}
依赖属性默认提供更改通知。您当前的 (CLR) 属性没有。
您好,我正在尝试设置一个带有一些文本和一个取消按钮的进度条,所以我使用了一个用户控件。我为此用户控件创建了属性(Min、Max、Value)以将它们传递给内部进度条。当我使用这些值初始化我的用户控件时,它会起作用,但是当我更新该值时,进度条不会移动。 有谁知道为什么? 当然,进度条所代表的工作是在单独的线程上完成的,并且值确实会更新并从 0 变为 100。
XAML
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<ProgressBar x:Name="progress_bar_internal" Minimum="{Binding Min}" Maximum="{Binding Max}" Value="{Binding Value}" Foreground="DarkGreen" Height="{Binding Height}" VerticalAlignment="Center"/>
<TextBlock Text="{Binding ElementName=progress_bar_internal, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</StackPanel>
<wpfui:Button Icon="PaneClose24" Grid.Column="1" VerticalAlignment="Center" Height="{Binding Height}" x:Name="cancel_btn" Background="DarkRed"/>
</Grid>
背后的代码
public partial class ProgressBar_w_Text : UserControl
{
public ProgressBar_w_Text()
{
InitializeComponent();
this.DataContext = this;
}
public event RoutedEventHandler Click
{
add { cancel_btn.AddHandler(ButtonBase.ClickEvent, value); }
remove { cancel_btn.RemoveHandler(ButtonBase.ClickEvent, value); }
}
public int Value { get; set; }
public int Max { get; set; }
public int Min { get; set; }
}
致电
<uc:ProgressBar_w_Text Visibility="Collapsed" x:Name="progress_bar" Height="50" Click="cancel_patcher" Min="0" Max="100" Value="15"/>
您应该将属性实现为 dependency properties 或实现 INotifyPropertyChanged
接口并在任何 属性 设置为新值时引发 PropertyChanged
事件。
如果您不执行上述任何操作,UI 就无法知道何时刷新。
这里是如何将 Value
作为依赖 属性 实现的示例:
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
nameof(Value), typeof(int), typeof(ProgressBar_w_Text));
public int Value
{
get => (int)GetValue(ValueProperty);
set => SetValue(ValueProperty, value);
}
依赖属性默认提供更改通知。您当前的 (CLR) 属性没有。