Witam,
Mam listę ze zdjęciami. Chcę je przenieść do obszaru graficznego.
Rozwiązałem to w ten sposób iż
klik na liście:
- wybiera numer indexu z listy
- uaktywnia nadrzędną warstwę canvas2 z obrazkiem (gdzie wkleja się obrazek z numerem wybranego indexu)
- przesuwam obrazek nad obszar graficzny,
kolejny klik - z listy jest wybierany odpowiedni obszar graficzny po x/y gdzie wklejany jest obrazek (nie zaimplementowane)
- warstwa kryjąca canvas2 jest wyłączana
Pytanie brzmi, czy taką operację da się przeprowadzić tylko poprzez przytrzymanie LPM ?
Problemem jest tu zdarzenie ListBox_SelectionChanged, które się uaktywnia i burzy cały misterny plan:
Jeżeli kliknę na listę poza elementami - wszystko działa jak należy, "pic_test" jest przesuwany pod wciśniętym LPM
Jeżeli wjadę na konkretny element na liście- nie działa, musze go dopiero kliknąć (nacisnąć i zwolnić LPM)
(obrazki to ikonki GIF w formacie 64x64)
<Grid>
<Canvas Name="canvas1" HorizontalAlignment="Left" Height="419" VerticalAlignment="Top" Width="792" Background="#FF969696"/>
<ListBox Name="lbx" HorizontalAlignment="Left" Height="234" VerticalAlignment="Top" Width="238" Margin="0,85,0,0" MouseMove="lbx_MouseMove" PreviewMouseDown="lbx_PreviewMouseDown"/>
<Canvas Name="canvas2" HorizontalAlignment="Left" Height="419" VerticalAlignment="Top" Width="792" MouseUp="canvas2_MouseUp" MouseMove="canvas2_MouseMove" />
<TextBlock Name="status" HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="28" Width="115" FontSize="16" Margin="667,38,0,0"/>
</Grid>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Move_Pic_3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public Image move_img = new Image();
public string selected = "";
public bool move_me = false;
public int mouse_x;
public int mouse_y;
public List<Picture> pictures = new List<Picture>();
public MainWindow()
{
InitializeComponent();
canvas2.Visibility = Visibility.Hidden;
Load_Data();
}
public void Load_Data()
{
Picture e1 = new Picture();
e1.path = "G://Test//pic1.gif";
pictures.Add(e1);
Picture e2 = new Picture();
e2.path = "G://Test//pic2.gif";
pictures.Add(e2);
selected = "G://Test//pic_test.gif";
//listbox
foreach (var e in pictures)
{
Image img = new Image();
img.Source = new BitmapImage(new Uri(e.path));
StackPanel sp = new StackPanel();
sp.Children.Add(img);
lbx.Items.Add(sp);
}
}
private void lbx_MouseMove(object sender, MouseEventArgs e)
{
if (canvas2.Visibility == Visibility.Hidden)
{
//take number of pic when MOUSE_OVER
var item = VisualTreeHelper.HitTest(lbx, Mouse.GetPosition(lbx)).VisualHit;
// find ListViewItem (or null)
while (item != null && !(item is ListBoxItem))
item = VisualTreeHelper.GetParent(item);
if (item != null)
{
int i = lbx.Items.IndexOf(((ListBoxItem)item).DataContext);
status.Text = string.Format("Selected item {0}", i);
selected = pictures[i].path;
}
}
}
private void lbx_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
canvas2.Visibility = Visibility.Visible;
canvas2.Children.Clear();
var point = Mouse.GetPosition(this.canvas1);
mouse_x = (int)point.X;
mouse_y = (int)point.Y;
move_img.Source = new BitmapImage(new Uri(selected));
canvas2.Children.Add(move_img);
Canvas.SetLeft(move_img, mouse_x - 32);
Canvas.SetTop(move_img, mouse_y - 32);
}
private void canvas2_MouseUp(object sender, MouseButtonEventArgs e)
{
canvas2.Visibility = Visibility.Hidden;
}
private void canvas2_MouseMove(object sender, MouseEventArgs e)
{
var point = Mouse.GetPosition(this.canvas2);
mouse_x = (int)point.X;
mouse_y = (int)point.Y;
Canvas.SetLeft(move_img, mouse_x - 32);
Canvas.SetTop(move_img, mouse_y - 32);
}
}
public class Picture
{
public string path;
public Picture()
{ }
}
}