簡體   English   中英

PreviewLeftButtonUp 觸發太晚

[英]PreviewLeftButtonUp fires too late

我正在制作一個簡單的程序,我可以在其中將元素拖放到網格中,但它們的位置取決於特定的列和行。 所以我嘗試使用PreviewLeftButtonUp事件來找出光標指向的位置,但它在Drop事件和元素放置在錯誤的位置后觸發。

XAML:

<Window x:Class="Pazzles.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Pazzles"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Menu x:Name="menu"  VerticalAlignment="Top" Grid.Row="0">
            <MenuItem Header="Розбити зображення">
                <MenuItem Header="Відкрити" Click="OpenImage_Click"/>
                <MenuItem Header="Розрізати зображення" Click="CutImage_Click"/>
            </MenuItem>
            <MenuItem Header="Зібрати пазл" Click ="OpenCatalog_Click">
            </MenuItem>
        </Menu>
        <Grid Grid.Row="1" Name="layout">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <ScrollViewer>
                <StackPanel x:Name="stackPanel" Width="150" Grid.Column="0"/>
            </ScrollViewer>
            
            <GridSplitter Grid.Column="1" ShowsPreview="False" Width="3" VerticalAlignment="Stretch" HorizontalAlignment="Center"/>
            <Grid x:Name="grid" Background="Transparent" Grid.Column="2" ShowGridLines="True" AllowDrop="True" PreviewMouseLeftButtonUp="grid_MouseMove" Drop ="grid_Drop">
                
            </Grid>
        </Grid>
    </Grid>
</Window>

C# :

private void img_MouseDown(object sender, MouseButtonEventArgs e)
{
   Image img = (Image)sender;
   DataObject dataObject = new DataObject(typeof(ImageSource), img.Source);
   DragDrop.DoDragDrop(img, dataObject, DragDropEffects.All);
}

private void grid_MouseMove(object sender, MouseEventArgs e)
{
   double y = e.GetPosition(grid).Y;
   double start = 0.0;
   row = 0;
   foreach (RowDefinition rd in grid.RowDefinitions)
   {
      start += rd.ActualHeight;
      if (y < start)
      {
         break;
      }
      row++;
   }
   double x = e.GetPosition(grid).X;
   start = 0.0;
   col = 0;
   foreach (ColumnDefinition cd in grid.ColumnDefinitions)
   {
      start += cd.ActualWidth;
      if (x < start)
      {
         break;
      }
      col++;
   }
}

private void grid_Drop(object sender, DragEventArgs e)
{
   Image imageControl = new Image { Stretch = Stretch.Fill };
   if ((e.Data.GetData(typeof(ImageSource)) != null))
   {
      ImageSource image = e.Data.GetData(typeof(ImageSource)) as ImageSource;
      imageControl = new Image() { Stretch = Stretch.Fill, Source = image };
   }
   else
   {
      if ((e.Data.GetData(typeof(Image)) != null))
      {
         Image image = e.Data.GetData(typeof(Image)) as Image;
         imageControl = image;
         if (((Grid)sender).Children.Contains(image))
         {
            ((Grid)sender).Children.Remove(image);
         }
      }
   }
   Grid.SetColumn(imageControl, col);
   Grid.SetRow(imageControl, row);

   ((Grid)sender).Children.Add(imageControl);
}

您可以使用Mouse.GetPosition()獲取grid_Drop方法中的位置,如下所示:

private void grid_Drop(object sender, DragEventArgs e)
{
    Point location = Mouse.GetPosition(grid);
    //do calculation from mouse_move method to get the col and row
    Image imageControl = new Image { Stretch = Stretch.Fill};
    if ((e.Data.GetData(typeof(ImageSource)) != null))
    {
        ImageSource image = e.Data.GetData(typeof(ImageSource)) as ImageSource;
        imageControl = new Image() { Stretch = Stretch.Fill, Source = image };
    }
    else
    {
        if ((e.Data.GetData(typeof(Image)) != null))
        {
            Image image = e.Data.GetData(typeof(Image)) as Image;
            imageControl = image;
            if (((Grid)sender).Children.Contains(image))
            {
                ((Grid)sender).Children.Remove(image);
            }
        }
    }
    Grid.SetColumn(imageControl, col);
    Grid.SetRow(imageControl, row);

    ((Grid)sender).Children.Add(imageControl);
}

暫無
暫無

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

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