You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中通过图表MouseDown事件修改圆形进度条Value属性的方法

解决WPF中点击BarGraph矩形更新ProgressCircle值的问题

你的问题核心在于构造函数仅执行一次,且BarGraph的BarValue变化时没有通知MainWindow,所以直接在构造函数里赋值只会设置初始值,后续点击矩形时ProgressCircle不会自动更新。下面提供两种实用的解决方案:

方法一:通过自定义事件传递值

这种方式适合更直接的代码交互,步骤如下:

  1. 修改BarGraph控件,添加自定义事件
    在你的BarGraph类中,定义一个事件用于通知外部BarValue的变化,然后在Rec_MouseDown中触发这个事件:

    public int BarValue { get; set; }
    // 定义自定义事件,传递新的BarValue值
    public event EventHandler<int> BarValueChanged;
    
    private void Rec_MouseDown(object sender, MouseButtonEventArgs e)
    {
        BarValue = Convert.ToInt32(((Rectangle)sender).Height);
        // 触发事件,通知外部值已更新
        BarValueChanged?.Invoke(this, BarValue);
    }
    
  2. 在MainWindow中订阅事件并更新ProgressCircle
    在MainWindow的构造函数里,订阅BarGraph的事件,当事件触发时更新圆形进度条的Value:

    public MainWindow()
    {
        InitializeComponent();
        // 绑定BarValue变化的事件
        bargraph.BarValueChanged += Bargraph_BarValueChanged;
    }
    
    private void Bargraph_BarValueChanged(object sender, int newValue)
    {
        // 更新圆形进度条的值
        progCircle.Value = newValue;
    }
    

方法二:使用WPF依赖属性绑定(更符合WPF设计理念)

这种方式利用WPF的绑定机制,让值的更新自动同步,步骤如下:

  1. 将BarGraph的BarValue改为依赖属性
    依赖属性是WPF实现数据绑定的核心,修改BarGraph的代码:

    // 定义BarValue依赖属性
    public static readonly DependencyProperty BarValueProperty =
        DependencyProperty.Register("BarValue", typeof(int), typeof(BarGraph), new PropertyMetadata(0));
    
    public int BarValue
    {
        get { return (int)GetValue(BarValueProperty); }
        set { SetValue(BarValueProperty, value); }
    }
    
    private void Rec_MouseDown(object sender, MouseButtonEventArgs e)
    {
        // 更新依赖属性值,绑定会自动同步
        BarValue = Convert.ToInt32(((Rectangle)sender).Height);
    }
    
  2. 在XAML中直接绑定ProgressCircle的Value
    修改MainWindow的XAML,将ProgressCircle的Value属性绑定到BarGraph的BarValue:

    <ControlExamplesVS:ProgressCircle x:Name="progCircle" 
                                      HorizontalAlignment="Left" Height="185" 
                                      Margin="760,99,0,0" VerticalAlignment="Top" Width="184" 
                                      IndicatorBrush="Cyan" BackgroundBrush="Transparent" 
                                      ProgressBorderBrush="DarkCyan"
                                      Value="{Binding ElementName=bargraph, Path=BarValue}"/>
    

为什么原来的方法无效?

你在构造函数中设置progCircle.Value = chart.BarValue时,BarValue还是默认的0值,而且后续点击矩形修改BarValue时,没有任何机制通知MainWindow去更新ProgressCircle的Value,所以圆形进度条不会有变化。上面两种方法分别通过事件通知和依赖属性绑定解决了这个问题。

内容的提问来源于stack exchange,提问作者Zia UsafXai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:51