Shift键简化

Shift key simplification

我目前正在处理一个项目,该项目处理来自 Livecharts 的图表,最近几天我一直在尝试实现 Shift + 鼠标选择点(文件浏览器的工作方式,包括与 Ctrl 键的组合),但我的代码似乎仅针对该功能看起来非常复杂,我想让它更简单。尽管如此,我还没有找到使它更难以理解的方法。代码如下:

private int movingPointIdx = -1; //-1: no point moving
List<int> highlightedIndex = new List<int>();
private int lastClickedPointIdx = -1;
int firstvaluepoint = 0;

private void ChartOnDataClick(object sender, ChartPoint p)
{
    Chartvalues = (ChartValues<ObservablePoint>)SeriesCollection[0].Values;
    bool shiftclick = false;
    int firstselectedpoint = 0;

    foreach (ObservablePoint val in Chartvalues)
    {
        if (val.X == p.X && val.Y == p.Y) //this is the clicked point
        {
            movingPointIdx = Chartvalues.IndexOf(val); //get index of currently clicked point
            firstselectedpoint = movingPointIdx;

            Chartvalues[movingPointIdx].X = Chartvalues[movingPointIdx].X; //highlights selected point

            if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) //Ctrl
            {
                if (highlightedIndex.Contains(movingPointIdx)) //remove point if already is in the highlightedIndex list
                {
                    highlightedIndex.Remove(movingPointIdx);
                    firstselectedpoint = movingPointIdx;
                    shiftclick = false;
                    return;
                }
                else //otherwise add it to the highlightedIndex list
                {
                    highlightedIndex.Add(movingPointIdx);
                    highlightedIndex.Sort();
                    firstselectedpoint = movingPointIdx;
                    shiftclick = false;
                }
            }
            else if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) //Shift
            {
                if (!shiftclick)
                {
                    highlightedIndex.Clear();
                    shiftclick = true;
                }

                if (lastClickedPointIdx > -1) //highlights all points 
                {                            
                    if (firstvaluepoint > firstselectedpoint)
                    {
                        for (int i = firstselectedpoint; i <= firstvaluepoint; i++)
                        {
                            highlightedIndex.Add(i);
                        }
                    }
                    else
                    {
                        for (int i = firstvaluepoint; i <= firstselectedpoint; i++)
                        {
                           highlightedIndex.Add(i);
                        }
                    }                                                        
                }
            }
            else //no modifier key pressed -> only add the current point to the list
            {
                highlightedIndex.Clear();
                highlightedIndex.Add(movingPointIdx);
            }

            lastClickedPointIdx = movingPointIdx;
            if (!shiftclick)
                firstvaluepoint = firstselectedpoint;                    
        }
    }
}

第一步有一种方法可以转换 if 逻辑:

if (val.X == p.X && val.Y == p.Y) //this is the clicked point

如果你进行反转,读取起来会更清晰

if(!(val.X == p.X && val.Y == p.Y)){
continue;
}

您可以轻松将该条件更改为函数

private bool IsTheClickedPoint(ObservablePoint val, ChartPoint p){
    return val.X == p.X && val.Y == p.Y;
}

所以如果会是这样:

if(!IsTheClickedPoint(val,p)){
continue;
}

第二步是当你想知道是否点击了某个键时,对if进行决策处理。如果你需要实现 ex,你会怎么做? alt点击?会是下一个ifology吗?

public bool IsCtrlClicked(){
return Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl);
}

因此,我建议您将最后一步和第三步移至命令模式之类的内容,以便更轻松地做出决策。这是 Java 的图表,但看起来很简单: