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 的图表,但看起来很简单:
我目前正在处理一个项目,该项目处理来自 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 的图表,但看起来很简单: