C# 选择“取消选择带有指针事件的行栅格UWP”
我想在指针按下事件后选择和取消选择悬停时的网格线。 我希望我能像在excel中那样做 当我向下拖动时,部分代码可以工作,但如果我向上拖动到第一个选定行,则选择仅保留在一行上 xaml: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
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();
}
}
}
}