WPF中处理LiveCharts CartesianChart中的MouseLeftButtonDown和MouseRightButtonDown事件的问题

ikfrs5lh  于 11个月前  发布在  Echarts
关注(0)|答案(1)|浏览(144)

我正在使用LiveCharts库开发一个WPF应用程序,特别是CartesianChart控件。我想在我的ViewModel中处理CartesianChart的MouseLeftButtonDown和MouseRightButtonDown事件,但我在使其工作时遇到了问题。
我已经在ViewModel中添加了事件处理程序,并将它们绑定到XAML代码中的事件,如下所示:

<lvc:CartesianChart
    x:Name="LibSpeed"
    DockPanel.Dock="Top"
    Series="{Binding SeriesCollection}"
    XAxes="{Binding XAxes}"
    YAxes="{Binding YAxes}"
    MouseLeftButtonDown="ChartMouseLeftButtonDownCommand"
    MouseRightButtonDown="ChartMouseRightButtonDownCommand">
</lvc:CartesianChart>

在我的ViewModel中:

private ICommand chartMouseLeftButtonDownCommand;
        public ICommand ChartMouseLeftButtonDownCommand
        {
            get => chartMouseLeftButtonDownCommand ?? (chartMouseLeftButtonDownCommand = new CommandHandler((parameter) =>
            {
                if (parameter is MouseEventArgs args)
                {
                    var mousePosition = args.GetPosition(null);
                    var x = mousePosition.X;
                    var y = mousePosition.Y;

                    if (lutLibrary.XValuesReduced.Contains(x) && lutLibrary.YValuesReduced.Contains(y))
                    {
                        lutLibrary.YValuesReduced = lutLibrary.YValuesReduced.Where(val => val != y).ToArray();
                        lutLibrary.XValuesReduced = lutLibrary.XValuesReduced.Where(val => val != x).ToArray();
                    }
                }
            }, () =>
            {

                return true;
            }));
        }

        private ICommand chartMouseRightButtonDownCommand;
        public ICommand ChartMouseRightButtonDownCommand
        {
            get => chartMouseRightButtonDownCommand ?? (chartMouseRightButtonDownCommand = new CommandHandler((parameter) =>
            {
                if (parameter is MouseEventArgs args)
                {
                    var mousePosition = args.GetPosition(null);
                    var xValue = mousePosition.X; // Mausposition für den x-Wert
                    var yValue = mousePosition.Y; // Mausposition für den y-Wert

                    lutLibrary.YValuesReduced.Append(yValue);
                    lutLibrary.XValuesReduced.Append(xValue);

                    MainWindow_ViewModel.initPoints();

                }
            }, () =>
            {
                return true;

但是,无法识别事件处理程序,我收到一条错误消息,代码无法运行。谁能帮助我理解为什么事件处理程序不能按预期工作?
提前感谢您的帮助!

1l5u6lss

1l5u6lss1#

事件处理程序需要与事件的委托匹配。
在这种情况下,您的事件处理程序方法需要采用以下形式:

public void MouseButtonEventHandler(object sender, MouseButtonEventArgs e)

它们将在视图的代码隐藏中,而不是在视图模型中。请注意,在上面的代码中,这是程序期望找到它们的地方,因为您没有为它们使用数据绑定。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.input.mousebuttoneventhandler?view=windowsdesktop-7.0
您可以在视图的代码隐藏中定义事件处理程序,并从那里调用视图模型中的命令--这是一种符合MVVM的快速简便的方法。就像这样:

public void ChartMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ViewModel.ChartCommand.Execute();
}

您可以在xaml中设置处理程序,如下所示:

<lvc:CartesianChart
    x:Name="LibSpeed"
    DockPanel.Dock="Top"
    Series="{Binding SeriesCollection}"
    XAxes="{Binding XAxes}"
    YAxes="{Binding YAxes}"
    MouseLeftButtonDown="ChartMouseLeftButtonDown"
    ...
</lvc:CartesianChart>

相关问题