簡體   English   中英

Select 使用指針事件取消選擇行網格 UWP

[英]Select deselect row grid with pointer events UWP

我想 select 並在指針按下事件后取消選擇 hover 上的網格線。 我希望我能像在 excel 中那樣做。

部分代碼在我向下拖動時有效,但如果我向上拖動到第一條選定的行,則選擇僅保留在一行上。

xaml:

<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>

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);
        }
    }

提前致謝!

部分代碼在我向下拖動時有效,但如果我向上拖動到第一條選定的行,則選擇僅保留在一行上。

您發布的代碼僅適用於向下拖動是因為向下拖動和向上拖動的邏輯不同。 向上拖動時,向上邏輯應與向下拖動時相反。

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

  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的值來檢查動作是向上拖動還是向下拖動,以便我們可以使用正確的邏輯來刪除和添加網格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM