m0_58844937 2024-05-19 10:25 采纳率: 94.3%
浏览 2
已结题

在主窗口中调用用户控件的 AxisYMax,AxisYMin 属性,图表没有发生对应的更新

遇到的问题,在主窗口中调用用户控件的 AxisYMax,AxisYMin 属性,图表没有发生对应的更新,并且主窗口的DataContext已被占用,这个该如何解决呀
用户控件:LineChart_UserControl的xaml代码:

<UserControl x:Class="IZeroVisionVM.LineChart_UserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
             xmlns:local="clr-namespace:IZeroVisionVM"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" Loaded="UserControl_Loaded">
        <Grid>
            <Grid>
                <lvc:CartesianChart Series="{Binding LineSeriesCollection}" LegendLocation="Right">
                <lvc:CartesianChart.AxisX>
                    <lvc:Axis Labels="{Binding Labels}" FontSize="14">
                        <lvc:Axis.Separator>
                            <lvc:Separator Step="1" />
                        </lvc:Axis.Separator>
                    </lvc:Axis>
                </lvc:CartesianChart.AxisX>
                <lvc:CartesianChart.AxisY>
                    <lvc:Axis LabelFormatter="{Binding CustomFormatterY}" MaxValue="{Binding AxisYMax}" MinValue="{Binding AxisYMin}" Position="LeftBottom">
                    </lvc:Axis>
                </lvc:CartesianChart.AxisY>
            </lvc:CartesianChart>
        </Grid>
    </Grid>
</UserControl>

用户控件后台代码:

using LiveCharts;
using LiveCharts.Wpf;
using Rapid.UI.IZVKernal;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace IZeroVisionVM
{
    /// <summary>
    /// LeftOutSide_UserControl.xaml 的交互逻辑
    /// </summary>
    public partial class LineChart_UserControl : UserControl , INotifyPropertyChanged
    {
        public List<string> Labels { get; set; }
        public SeriesCollection LineSeriesCollection { get; set; }

        private double axisYMax;
        public double AxisYMax
        {
            get { return axisYMax; }
            set { axisYMax = value; this.RaisePropertyChanged("AxisYMax"); }
        }
        private double axisYMin;
        public double AxisYMin
        {
            get { return axisYMin; }
            set { axisYMin = value; this.RaisePropertyChanged("AxisYMin"); }
        }

        public Func<double, string> CustomFormatterY { get; set; }

        public LineChart_UserControl()
        {
            InitializeComponent();
        }

        //绑定的X轴数据
        public static ChartValues<double> ValueList { get; set; }
        public void OnClick(float distance)
        {
            //向图表中添加数据
            ValueList.Add(distance);
            //这里如果移除数组,图表曲线会原地起伏,就没有X轴移动的动画效果了
            if (ValueList.Count > 11)
            {
                ValueList.RemoveAt(0);
            }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            Mode();
            this.DataContext = this;
        }

        private string CustomFormattersY(double val)
        {
            return string.Format("{0} mm", val);
        }

        public void Mode()
        {
            Labels = new List<string>();
            AxisYMax = 420 + 30;
            double max = AxisYMax - 30;
            double warningMax = 400;
            double guige = 390;
            double warningMin = 380;
            AxisYMin = 370 - 20;
            double min = AxisYMin + 20;
            LineChart_UserControl.ValueList = new ChartValues<double>();
            LineSeriesCollection = new SeriesCollection
                {
                    new LineSeries
                    {
                        Title = $"上限:{max} mm",
                        Values = new ChartValues<double> { max, max, max, max, max, max, max, max, max, max, max},
                        Stroke = System.Windows.Media.Brushes.Red,
                        PointGeometry = null,
                        Fill = System.Windows.Media.Brushes.LightBlue,
                    },

                    new LineSeries
                    {
                        Title = $"预警线:{warningMax} mm",
                        StrokeDashArray = new System.Windows.Media.DoubleCollection {2},
                        Values = new ChartValues<double> { warningMax, warningMax, warningMax, warningMax, warningMax, warningMax, warningMax, warningMax, warningMax, warningMax, warningMax},
                        Stroke = System.Windows.Media.Brushes.Blue,
                        PointGeometry = null,
                        Fill = System.Windows.Media.Brushes.LightBlue,
                    },

                    new LineSeries
                    {
                        Title = $"规格:{guige} mm",
                        Values = new ChartValues<double> { guige, guige, guige, guige, guige, guige, guige, guige, guige, guige, guige},
                        Stroke = System.Windows.Media.Brushes.Green,
                        PointGeometry = null,
                        Fill = System.Windows.Media.Brushes.LightBlue,
                    },

                    new LineSeries
                    {
                        Title = $"预警线:{warningMin} mm",
                        StrokeDashArray = new System.Windows.Media.DoubleCollection {2},
                        Values = new ChartValues<double> { warningMin, warningMin, warningMin, warningMin, warningMin, warningMin, warningMin, warningMin, warningMin, warningMin, warningMin},
                        Stroke = System.Windows.Media.Brushes.Blue,
                        PointGeometry = null,
                        Fill = System.Windows.Media.Brushes.LightBlue,
                    },

                    new LineSeries
                    {
                        Title = $"下限:{min} mm",
                        Values = new ChartValues<double> { min, min, min, min, min, min, min, min, min, min, min},
                        Stroke = System.Windows.Media.Brushes.Red,
                        PointGeometry = null,
                        Fill = System.Windows.Media.Brushes.LightBlue,
                    }
                };

            CustomFormatterY = CustomFormattersY;

            LineSeries lineseries = new LineSeries();
            lineseries.Title = "极耳中心距";
            //lineseries.Stroke = System.Windows.Media.Brushes.Purple;
            lineseries.DataLabels = true;
            lineseries.Values = LineChart_UserControl.ValueList;
            LineSeriesCollection.Add(lineseries);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

在MainWindow窗口添加用户控件 LineChart_UserControl

 <Grid Grid.Row="0" Grid.Column="2">
            <local:LineChart_UserControl></local:LineChart_UserControl>
</Grid>
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-19 10:25
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】: 您提问的目的是解决在使用WPF和LiveCharts库构建的图表用户控件时,当在主窗口中修改用户控件的AxisYMaxAxisYMin属性后,图表没有按预期更新的问题。

    【问题出现原因】: 问题可能出现的原因有:

    1. 数据绑定没有正确设置,导致属性更改没有通知图表进行更新。
    2. INotifyPropertyChanged接口的实现可能存在问题,没有正确触发属性更改事件。
    3. 图表控件可能没有正确响应属性更改事件,或者需要手动刷新图表视图。

    【问题解决方案】:

    1. 确保AxisYMaxAxisYMin属性的setter方法中调用了RaisePropertyChanged方法,以通知数据绑定系统属性已更改。
    2. 检查LiveCharts的Axis对象是否需要手动刷新或重新绑定数据来响应属性更改。
    3. 如果图表控件需要手动刷新,可以在属性更改后调用图表控件的刷新或重绘方法。

    【提供代码】: 以下是针对您提供代码的修改建议:

    LineChart_UserControl类中,确保AxisYMaxAxisYMin属性的setter方法调用了RaisePropertyChanged

    public double AxisYMax
    {
        get { return axisYMax; }
        set 
        { 
            axisYMax = value; 
            RaisePropertyChanged("AxisYMax");
            // 如果需要,可以在这里添加代码来手动刷新图表
        }
    }
    
    public double AxisYMin
    {
        get { return axisYMin; }
        set 
        { 
            axisYMin = value; 
            RaisePropertyChanged("AxisYMin");
            // 如果需要,可以在这里添加代码来手动刷新图表
        }
    }
    

    如果LiveCharts需要手动刷新,可以在属性更改后添加以下代码:

    // 假设CartesianChart的实例名为myCartesianChart
    myCartesianChart.UpdateLayout();
    

    【代码运行方式】:

    1. 确保您的开发环境已安装Visual Studio,并配置了WPF开发环境。
    2. 将修改后的代码替换到您的项目中。
    3. 重新编译并运行您的应用程序。

    【代码预期运行结果】: 当在主窗口中更改AxisYMaxAxisYMin属性时,图表应该能够根据新的属性值进行更新。

    【推荐相关链接】:

    1. LiveCharts.Wpf官方文档
    2. WPF数据绑定概述
    3. INotifyPropertyChanged接口
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 修改了问题 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀