首页 > 解决方案 > 使用指针事件选择取消选择行网格 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);
        }
    }

提前致谢!

标签: c#xamluwp

解决方案


部分代码在我向下拖动时有效,但如果我向上拖动到第一条选定的行,则选择仅保留在一行上。

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

我稍微更改了您的代码以更正它。你可以看看下面的代码:

  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检查操作是向上拖动还是向下拖动的值,以便我们可以使用正确的逻辑来删除和添加网格。


推荐阅读