[英]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.