drag & drop pod WPF

0

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()
        { }
    }
}
1

Zainteresuj się może gong-wpf-dragdrop

Pozdrawiam,

mr-owl

2

moze tu cos znajdziesz

1 użytkowników online, w tym zalogowanych: 0, gości: 1