C# 选择“取消选择带有指针事件的行栅格UWP”

C# 选择“取消选择带有指针事件的行栅格UWP”,c#,xaml,uwp,C#,Xaml,Uwp,我想在指针按下事件后选择和取消选择悬停时的网格线。 我希望我能像在excel中那样做 当我向下拖动时,部分代码可以工作,但如果我向上拖动到第一个选定行,则选择仅保留在一行上 xaml: 0,0,0,1 #FFB7B7 xaml.cs: SolidColorBrush selectedColor = new SolidColorBrush(Colors.Red); SolidColorBrush deselectedColor = new SolidColorBrush(Col

我想在指针按下事件后选择和取消选择悬停时的网格线。 我希望我能像在excel中那样做

当我向下拖动时,部分代码可以工作,但如果我向上拖动到第一个选定行,则选择仅保留在一行上

xaml:


0,0,0,1
#FFB7B7
xaml.cs:

    SolidColorBrush selectedColor = new SolidColorBrush(Colors.Red);
    SolidColorBrush deselectedColor = new SolidColorBrush(Colors.Transparent);

    bool pressed = false;
    bool selected = false;

    List<Grid> SelectedGrid = new List<Grid>();

    double entered;
    double exited;


    public MainPage()
    {
        this.InitializeComponent();
    }

    private void GridPointerPressed(object sender, PointerRoutedEventArgs e)
    {
        if (selected)
        {
            selected = false;
            foreach (Grid grid in SelectedGrid)
            {
                grid.Background = deselectedColor;
            }
            SelectedGrid = new List<Grid>();
        }

        if (!pressed)
        {
            SelectedGrid.Add((Grid)sender);
            ((Grid)sender).Background = selectedColor;
            pressed = true;
        }
    }


    private void GridPointerReleased(object sender, PointerRoutedEventArgs e)
    {
        pressed = false;
        selected = true;
    }


    private void GridPointerEntered(object sender, PointerRoutedEventArgs e)
    {
        entered = e.GetCurrentPoint(GridDay).Position.Y;

        if (pressed)
        {
            ((Grid)sender).Background = selectedColor;
            SelectedGrid.Add((Grid)sender);
        }
    }

    private void GridPointerExited(object sender, PointerRoutedEventArgs e)
    {
        exited = e.GetCurrentPoint(GridDay).Position.Y;

        bool up = entered > exited;

        if (pressed && up)
        {
            SelectedGrid[SelectedGrid.Count - 1].Background = deselectedColor;
            SelectedGrid.RemoveAt(SelectedGrid.Count - 1);
        }
    }
SolidColorBrush selectedColor=新的SolidColorBrush(Colors.Red);
SolidColorBrush DeceledColor=新的SolidColorBrush(Colors.Transparent);
bool=false;
bool selected=false;
List SelectedGrid=新建列表();
双重输入;
双重退出;
公共主页()
{
this.InitializeComponent();
}
private void GridPointerPressed(对象发送方,PointerRoutedEventArgs e)
{
如果(选定)
{
所选=假;
foreach(SelectedGrid中的栅格)
{
grid.Background=取消选择颜色;
}
SelectedGrid=新列表();
}
如果(!按下)
{
选择EdGrid.Add((网格)发件人);
((网格)发件人)。背景=所选颜色;
按下=真;
}
}
私有void GridPointerReleased(对象发送方,PointerRoutedEventArgs e)
{
按下=假;
所选=真;
}
私有void GridPointerEntered(对象发送方,PointerRoutedEventArgs e)
{
输入=e.GetCurrentPoint(GridDay).Position.Y;
如果(按下)
{
((网格)发件人)。背景=所选颜色;
选择EdGrid.Add((网格)发件人);
}
}
私有void GridPointerExited(对象发送方,PointErroroutedEventArgs e)
{
exited=e.GetCurrentPoint(GridDay).Position.Y;
bool up=已输入>已退出;
如果(按下并向上)
{
SelectedGrid[SelectedGrid.Count-1]。背景=取消EdColor;
SelectedGrid.RemoveAt(SelectedGrid.Count-1);
}
}
提前谢谢

当我向下拖动时,部分代码可以工作,但如果我向上拖动到第一个选定行,则选择仅保留在一行上

您发布的代码只适用于“向下拖动”,因为“向下拖动”和“向上拖动”的逻辑不同。向上拖动时,向上逻辑应与向下拖动时相反

我对你的代码做了一点修改。您可以查看以下代码:

  double beginposition;

  private void GridPointerPressed(object sender, PointerRoutedEventArgs e)
    {
        beginposition = e.GetCurrentPoint(GridDay).Position.Y;

        PressedGridName = ((Grid)sender).Name;

        if (selected)
        {
            selected = false;
            foreach (Grid grid in SelectedGrid)
            {
                grid.Background = deselectedColor;
            }
            SelectedGrid = new List<Grid>();
        }

        if (!pressed)
        {
            SelectedGrid.Add((Grid)sender);
            ((Grid)sender).Background = selectedColor;
            pressed = true;
        }
    }

  private void GridPointerEntered(object sender, PointerRoutedEventArgs e)
    {
        entered = e.GetCurrentPoint(GridDay).Position.Y;

        //if (pressed)
        //{
        //    ((Grid)sender).Background = selectedColor;
        //    SelectedGrid.Add((Grid)sender);
        //}
    }

    private void RemoveGrid() 
    {
        SelectedGrid[SelectedGrid.Count - 1].Background = deselectedColor;
        SelectedGrid.RemoveAt(SelectedGrid.Count - 1);
    }

    private void AddGrid(object sender) 
    {
        ((Grid)sender).Background = selectedColor;
        SelectedGrid.Add((Grid)sender);
    }

    private void GridPointerExited(object sender, PointerRoutedEventArgs e)
    {
        exited = e.GetCurrentPoint(GridDay).Position.Y;

        bool direction = entered > beginposition;


        if (pressed && direction)
        {
            // drag down
            bool up = entered > exited;
            if (pressed && up)
            {
                // prevent it removes the original pressed button
                if (SelectedGrid[SelectedGrid.Count - 1].Name != PressedGridName)
                {
                    RemoveGrid();
                }
               
            }
            else if (pressed && !up)
            {
                AddGrid(sender);
            }
        }
        else if (pressed && !direction) 
        {
            // drag up
            bool up = entered > exited;

            if (pressed && up)
            {
                AddGrid(sender);
            }
            else if (pressed && !up)
            {
                // prevent it removes the original pressed button
                if (SelectedGrid[SelectedGrid.Count - 1].Name != PressedGridName)
                {
                    RemoveGrid();
                }
            }
        }
    }
双起始位置;
private void GridPointerPressed(对象发送方,PointerRoutedEventArgs e)
{
beginposition=e.GetCurrentPoint(GridDay).Position.Y;
按EdGridName=((网格)发件人)。姓名;
如果(选定)
{
所选=假;
foreach(SelectedGrid中的栅格)
{
grid.Background=取消选择颜色;
}
SelectedGrid=新列表();
}
如果(!按下)
{
选择EdGrid.Add((网格)发件人);
((网格)发件人)。背景=所选颜色;
按下=真;
}
}
私有void GridPointerEntered(对象发送方,PointerRoutedEventArgs e)
{
输入=e.GetCurrentPoint(GridDay).Position.Y;
//如果(按下)
//{
//((网格)发件人)。背景=所选颜色;
//选择EdGrid.Add((网格)发件人);
//}
}
私有void RemoveGrid()
{
SelectedGrid[SelectedGrid.Count-1]。背景=取消EdColor;
SelectedGrid.RemoveAt(SelectedGrid.Count-1);
}
私有void AddGrid(对象发送方)
{
((网格)发件人)。背景=所选颜色;
选择EdGrid.Add((网格)发件人);
}
私有void GridPointerExited(对象发送方,PointErroroutedEventArgs e)
{
exited=e.GetCurrentPoint(GridDay).Position.Y;
bool direction=entered>beginposition;
如果(按下方向)(&D)
{
//拖下来
bool up=已输入>已退出;
如果(按下并向上)
{
//防止它删除原来按下的按钮
如果(SelectedGrid[SelectedGrid.Count-1].Name!=按EdGridName)
{
RemoveGrid();
}
}
else if(按下&&!向上)
{
AddGrid(发送方);
}
}
else if(按&&!方向)
{
//拉起
bool up=已输入>已退出;
如果(按下并向上)
{
AddGrid(发送方);
}
else if(按下&&!向上)
{
//防止它删除原来按下的按钮
如果(SelectedGrid[SelectedGrid.Count-1].Name!=按EdGridName)
{
RemoveGrid();
}
}
}
}
我添加了一个名为
beginposition
的值来检查操作是向上拖动还是向下拖动,以便使用正确的逻辑删除和添加网格

  double beginposition;

  private void GridPointerPressed(object sender, PointerRoutedEventArgs e)
    {
        beginposition = e.GetCurrentPoint(GridDay).Position.Y;

        PressedGridName = ((Grid)sender).Name;

        if (selected)
        {
            selected = false;
            foreach (Grid grid in SelectedGrid)
            {
                grid.Background = deselectedColor;
            }
            SelectedGrid = new List<Grid>();
        }

        if (!pressed)
        {
            SelectedGrid.Add((Grid)sender);
            ((Grid)sender).Background = selectedColor;
            pressed = true;
        }
    }

  private void GridPointerEntered(object sender, PointerRoutedEventArgs e)
    {
        entered = e.GetCurrentPoint(GridDay).Position.Y;

        //if (pressed)
        //{
        //    ((Grid)sender).Background = selectedColor;
        //    SelectedGrid.Add((Grid)sender);
        //}
    }

    private void RemoveGrid() 
    {
        SelectedGrid[SelectedGrid.Count - 1].Background = deselectedColor;
        SelectedGrid.RemoveAt(SelectedGrid.Count - 1);
    }

    private void AddGrid(object sender) 
    {
        ((Grid)sender).Background = selectedColor;
        SelectedGrid.Add((Grid)sender);
    }

    private void GridPointerExited(object sender, PointerRoutedEventArgs e)
    {
        exited = e.GetCurrentPoint(GridDay).Position.Y;

        bool direction = entered > beginposition;


        if (pressed && direction)
        {
            // drag down
            bool up = entered > exited;
            if (pressed && up)
            {
                // prevent it removes the original pressed button
                if (SelectedGrid[SelectedGrid.Count - 1].Name != PressedGridName)
                {
                    RemoveGrid();
                }
               
            }
            else if (pressed && !up)
            {
                AddGrid(sender);
            }
        }
        else if (pressed && !direction) 
        {
            // drag up
            bool up = entered > exited;

            if (pressed && up)
            {
                AddGrid(sender);
            }
            else if (pressed && !up)
            {
                // prevent it removes the original pressed button
                if (SelectedGrid[SelectedGrid.Count - 1].Name != PressedGridName)
                {
                    RemoveGrid();
                }
            }
        }
    }