c# - 使用指针事件选择取消选择行网格 UWP
问题描述
我想在指针按下事件后选择和取消选择悬停时的网格线。我希望我能做到这一点,例如在 excel 中。
部分代码在我向下拖动时有效,但如果我向上拖动到第一条选定的行,则选择仅保留在一行上。
xml:
<Page.Resources>
<Thickness x:Key="BorderThickness">0,0,0,1</Thickness>
<Color x:Key="BorderColor">#FFB7B7B7</Color>
</Page.Resources>
<Grid>
<Grid x:Name="GridDay" Width="200" Height="250" Background="#FFF2F2F2">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid x:Name="Gg0" Grid.Row="0" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg1" Grid.Row="1" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg2" Grid.Row="2" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg3" Grid.Row="3" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg4" Grid.Row="4" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg5" Grid.Row="5" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg6" Grid.Row="6" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg7" Grid.Row="7" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg8" Grid.Row="8" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg9" Grid.Row="9" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
<Grid x:Name="Gg10" Grid.Row="10" BorderBrush="{StaticResource BorderColor}" BorderThickness="{StaticResource BorderThickness}" PointerPressed="GridPointerPressed" PointerReleased="GridPointerReleased" PointerEntered="GridPointerEntered" PointerExited="GridPointerExited" Background="Transparent"/>
</Grid>
</Grid>
xml.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);
}
}
提前致谢!
解决方案
部分代码在我向下拖动时有效,但如果我向上拖动到第一条选定的行,则选择仅保留在一行上。
您发布的代码仅适用于向下拖动是因为向下拖动和向上拖动的逻辑不同。向上拖动时,向上逻辑应与向下拖动时相反。
我稍微更改了您的代码以更正它。你可以看看下面的代码:
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();
}
}
}
}
我添加了一个名为beginposition
检查操作是向上拖动还是向下拖动的值,以便我们可以使用正确的逻辑来删除和添加网格。
推荐阅读
- c - C中的动态2数组
- php - 使用 php soap 使用 OpenTravel WSDL
- android - 注册和注销广播接收器?
- apache-camel - 动态更改属性占位符的值
- ontology - owl api state ObjectProperty 个人之间的关系来自进口
- html - 从 html 表单向 jsp 提交“null”
- node.js - |节点.JS| 每当我得到 params.id 时,我就会得到 jumbotron.css
- java - 在 Eclipse 中对 Java 9 模块化项目进行 JUnit 测试
- ldap - CAS 5.2.4 cas.properties 位置
- c# - 为什么 C# 在 XDocument 中留下未闭合的标签?