Autor Beitrag
Lisanna
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 11.12.14 09:38 
Hallo Community :wink:,

ich bin versuche mich zurzeit an Drag and Drop und habe leider ein kleines Problem.

Ich habe ein Treeview erstellt die Elternknoten bestehen aus einem Image und die Kindknoten
bestehen aus Dockpanel die bis zu einem oder mehrere Bildern enthalten.

Nun möchte ich die Kindknoten(Dockpanel) per Drag and Drop in ein anderes unabhängiges
Dockpanel droppen. Habe dem Dockpanel Eventhandler fürs Drag and Drop hinzugefügt, sodass man nur die Kindknoten verschieben kann. Doch wenn ich dies versuche erhalte ich folgende Fehlermeldung:

InvalidOperationException:
Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch.

Ich weiß das ich nun das Dockpanel das ich droppen möchte vom Treeview trennen muss (oder erst vom Elternknoten und dann erst vom ganzen Treeview?), bekomm es aber nicht hin.

Ich hoffe ihr könnt mir da weiterhelfen,

LG, Lisanna
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 11.12.14 13:45 
Hallo Lisanna,

was hast du denn bisher schon versucht?
Der Abschnitt "Deleting TreeView Items" aus Working with WPF TreeView sollte dir weiterhelfen.
Lisanna Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 12.12.14 09:37 
Hallo Th96,

Danke für den Link aber genau das hab ich auch schon versucht, das funktioniert leider auch nicht, (erhalte dann eine ArgumentOutOfRangeException mit folgender Meldung: "removeIndex" ist kleiner Null oder größer/gleich "Count". (Der index ist immer -1))
habe es mit Remove versucht zum Test hab ich auch Clear verwendet bringt nichts.
Bekomme immer die gleiche Fehlermeldung :(
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 12.12.14 10:48 
Dann zeig mal deinen Code.
Lisanna Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 12.12.14 12:01 
Hier ist zuerstmal mein XAML Code:

ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
<Window x:Class="MergeWPF.LokalisationVergleich"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="LokalisationVergleich" Height="797" Width="1627" WindowStartupLocation="CenterScreen" WindowStyle="None" Name="LK">
    <Grid Focusable="True">
        <Button Background="#DC000095" BorderBrush="#FF0000AF" Content="Zusammenführen" FontFamily="Berlin Sans FB" FontSize="16" Foreground="Ivory" Height="51" HorizontalAlignment="Left" IsDefault="True" Margin="1170,695,0,0" Name="btnZusammenführenLok" VerticalAlignment="Top" Width="184" Click="btnZusammenführenLok_Click" Focusable="True"/>
        <Button Background="#DC000095" BorderBrush="#FF0000AF" Content="Konvertierung Beenden" FontFamily="Berlin Sans FB" FontSize="16" Foreground="Ivory" Height="51" HorizontalAlignment="Left" IsDefault="True" Margin="1389,695,0,0" Name="btnbeendenLok" VerticalAlignment="Top" Width="184" Click="btnbeendenLokalisation_Click"  Focusable="True"/>
        <Label Content="" Height="37" HorizontalAlignment="Left" Margin="108,12,0,0" Name="lblPatientenName" VerticalAlignment="Top" Width="245" Foreground="Ivory" FontSize="14" FontFamily="Berlin Sans FB" />
        <Label Content="Zieldatenbank:" Height="28" HorizontalAlignment="Left" Margin="22,55,0,0" Name="lblZieldatenbank" VerticalAlignment="Top" Foreground="Ivory" FontSize="13" FontFamily="Berlin Sans FB"/>
        <Label Content="Datenbank:" FontFamily="Berlin Sans FB" FontSize="13" Foreground="Ivory" Height="28" HorizontalAlignment="Left" Margin="844,55,0,0" Name="lblDatenbank" VerticalAlignment="Top" />
        <Label Content="Patient:" Height="37" HorizontalAlignment="Left" Margin="22,12,0,0" Name="lblPatient" VerticalAlignment="Top" Width="80" Foreground="Ivory" FontSize="14" FontFamily="Berlin Sans FB"/>
        <Canvas Height="100" HorizontalAlignment="Left" Margin="246,75,0,0" Name="cvLok" VerticalAlignment="Top" Width="200" />
        <DockPanel Height="361" Name="dpZieldatenbank" Width="699" Margin="22,315,884,82" AllowDrop="True" Drop="Fit_ImageDrop">
            <DockPanel.Background>
                <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                    <GradientStop Color="Black" Offset="0" />
                    <GradientStop Color="#FFA00000" Offset="1" />
                </LinearGradientBrush>
            </DockPanel.Background>
        </DockPanel>
        <TreeView SelectedItemChanged="tVLok_SelectedItemChanged" Height="587" HorizontalAlignment="Left" Margin="844,89,0,0" Name="tVLok" VerticalAlignment="Top" Width="703" >
            <TreeView.Background>
                <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                    <GradientStop Color="Black" Offset="0" />
                    <GradientStop Color="#FF49AA1F" Offset="1" />
                </LinearGradientBrush>
            </TreeView.Background>
        </TreeView>
    </Grid>
    <Window.BorderBrush>
        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
            <GradientStop Color="Black" Offset="0" />
            <GradientStop Color="#CD1E1EB4" Offset="1" />
        </LinearGradientBrush>
    </Window.BorderBrush>
    <Window.Background>
        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
            <GradientStop Color="Black" Offset="1" />
            <GradientStop Color="#FF002D69" Offset="0.477" />
        </LinearGradientBrush>
    </Window.Background>
</Window>




Im folgenden Code werden die Knoten zum Treeview hinzugefügt:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
int i = 0;
            int x = 0;
            foreach (BehandlungsObj row in behObj)
            {
                parent = new TreeViewItem();
                DockPanel spImage = new DockPanel();
                int pic_nr2 = row.Pic_nr;
                double x_detail2 = row.Y_detail;
                double y_detail2 = row.X_detail;
                LocRadar LocR2 = new LocRadar(pic_nr2, x_detail2, y_detail2);
                path = (System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + "//Bilder//");
                if (File.Exists(path + LocR2.detailPic))
                {
                    Canvas canvas = new Canvas();
                    BitmapImage bmIDB1 = new BitmapImage();
                    bmIDB1.BeginInit();
                    bmIDB1.UriSource = new Uri(path + LocR2.detailPic);
                    bmIDB1.EndInit();
                    double height = bmIDB1.Height;
                    double width = bmIDB1.Width;

                    Ellipse ellipse = new Ellipse();
                    SolidColorBrush scb = new SolidColorBrush();
                    ImageBrush ib = new ImageBrush();

                    ib.ImageSource = new BitmapImage(new Uri(path + LocR2.detailPic, UriKind.RelativeOrAbsolute));
                    canvas.Background = ib;
                    canvas.Width = width;
                    canvas.Height = height;
                    scb.Color = System.Windows.Media.Color.FromArgb(25525500);
                    ellipse.Fill = scb;
                    ellipse.StrokeThickness = 5;
                    ellipse.Stroke = System.Windows.Media.Brushes.Red;
                    ellipse.Height = 8;
                    ellipse.Width = 8;
                    canvas.Children.Add(ellipse);

                    if (LocR2.zone != 9)
                    {
                        Canvas.SetLeft(ellipse, LocR2.xRadar);
                        Canvas.SetTop(ellipse, LocR2.yRadar);
                    }
                    x = 50;
                    i = 0;

                    parent.Header = canvas;
                    tVLok.Items.Add(parent);
 
                    dp_Image = new DockPanel();
                    dp_Image.DragEnter += new DragEventHandler(Image_DragEnter);
                    dp_Image.PreviewMouseMove += new MouseEventHandler(Image_PreviewMouseMove);
                    dp_Image.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Image_PreviewMouseLeftButtonDown);
                    dp_Image.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(Image_PreviewMouseLeftButtonUp);

                    foreach (string pfad in row.Bildpfade)
                    {
                        TreeViewItem child = new TreeViewItem();

                        Panel p = new Grid();
                        string image = crypt.getImageString(pfad);
                        string dbpfad = this.strDB2.Replace("\\DataHandling.mdb""");
                        image = image.Replace("C:\\Database""C:\\Datenbank");
                        if (File.Exists(image))
                        {
                            Image i2 = new Image();
                            i2.Width = 128;
                            i2.Height = 128;
                            BitmapImage bi = new BitmapImage();
                            bi.BeginInit();
                            bi.UriSource = new Uri(image);
                            bi.CacheOption = BitmapCacheOption.OnLoad;
                            bi.EndInit();
                            i2.Source = bi;
                            i2.Stretch = Stretch.Fill;
                            dp_Image.Children.Add(i2);


                        }
                        x += 150;
                        i++;
                       
                    }
                    parent.Items.Add(dp_Image);
                   
                    
                }
                
            }




Und zu letzt noch die Methoden für das DragDrop
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
private void Image_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("UIElement"))
            {
                e.Effects = DragDropEffects.Copy;
            }
        }

        private void Image_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.Source == this.tVLok)
            {
            }
            else
            {
                _isDown = true;
                _startPoint = e.GetPosition(this.tVLok);
            }
        }


        private void Image_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _isDown = false;
            _isDragging = false;
            //_realDragSource.ReleaseMouseCapture()
        }

        private void Image_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (_isDown)
            {
                if ((_isDragging == false) && ((Math.Abs(e.GetPosition(this.tVLok).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
                    (Math.Abs(e.GetPosition(this.tVLok).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
                {
                    _isDragging = true;
                    _realDragSource = e.Source as UIElement;
                    _realDragSource.CaptureMouse();
                    DragDrop.DoDragDrop(_dummyDragSource, new DataObject("UIElement", e.Source, true), DragDropEffects.Copy);
                }
            }

            if (!_isDragging && e.LeftButton == MouseButtonState.Pressed)
            {
                _isDragging = true;
                DragDrop.DoDragDrop(tVLok, tVLok.SelectedItem, DragDropEffects.Copy);
                _realDragSource = e.Source as UIElement;
                _realDragSource.CaptureMouse();
                DragDrop.DoDragDrop(_dummyDragSource, new DataObject("UIElement", e.Source, true), DragDropEffects.Copy);
            }
        }

        private void Fit_ImageDrop(object sender, DragEventArgs e)
        {
            try
            {
                if (e.Data.GetDataPresent("UIElement"))
                {
                    UIElement droptarget = e.Source as UIElement;
                    int droptargetIndex = -1, i = 0;
                    foreach (UIElement element in this.dp_Image.Children)
                    {
                        if (element.Equals(droptarget))
                        {
                            droptargetIndex = i;
                            break;
                        }
                        i++;
                    }

                    _isDown = false;
                    _isDragging = false;
                    _realDragSource.ReleaseMouseCapture();
                    tVLok.Items.Remove(_realDragSource);
                    parent.Items.Remove(_realDragSource);
                    dp_Image.Children.Remove(_realDragSource);

                    dpZieldatenbank.Children.Add(_realDragSource);
                }
            }
            catch (InvalidOperationException ioe)
            {
                MessageBox.Show(ioe.ToString());
                throw ioe;
            }
        }

        private void Image_DragOver(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(Task)))
            {
                e.Effects = DragDropEffects.Copy;
            }
            else
            {
                e.Effects = DragDropEffects.Copy;
            }
        }





Danke für die Mühe :wink:
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 12.12.14 13:21 
Hallo,

der relevante Teil hätte aber gereicht. ;-)

Ich weiß zwar nicht, was genau die Variablen tVLok und parent sind, aber m.E. müßtest du einfach den Parent des _realDragSource benutzen:
ausblenden C#-Quelltext
1:
2:
3:
var parent = _realDragSource.Parent;

parent.Items.Remove(_realDragSource);

(und die anderen Remove-Aufrufe entfernen, denn diese scheinst du ja nur zum Ausprobieren hinzugefügt zu haben).

Und noch als Tipp: wenn du größere Projekte mit WPF planst, solltest du dich mal in MVVM einlesen, damit du eine klarere Trennung zwischen UI und Daten hinbekommst (d.h. besonders bezogen auf deinen 2. Code-Ausschnitt).
Lisanna Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 12.12.14 13:35 
Hi,

sry war wohl wieder zu übereifrig gewesen, deswegen wollt ich wohl alles posten. :D

tVLok ist der Name des Treeviews und parent ist ein TreeViewItem und _realDragSource ist ein UIElement.

Habs ausprobiert aber _realDragSource.Parent geht nicht, da heißt es nur
Zitat:
UIElement enthält keine Definition für Parent.


Aber trotzdem vielen Dank für die Hilfe :wink:

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 12.12.14 14:36 
Stimmt, Parent ist erst im abgeleiteten FrameworkElement (und nicht schon in UIElement) definiert.
Kannst ja mal den Datentyp entsprechend ändern (und noch zusätzlich auf null abfragen, falls die as-Umwandlung nicht geklappt hat).

Alternativ kannst du auch den VisualTreeHelper oder LogicalTreeHelper mit dessen GetParent-Methode anschauen (aber auch da müßtest du entsprechend umwandeln [casten]).

PS: Mir scheint, dir fehlen noch ein paar grundsätzliche Programmierkenntnisse, denn du kannst ja nicht einfach irgendein Objekt (TreeViewItem parent) benutzen, sondern du mußt schon wissen, welche Objektinstanz du konkret benötigst.

Für diesen Beitrag haben gedankt: Lisanna
Lisanna Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 18.12.14 08:27 
Hi Th69,

Stimmt, mir fehlen einige Programmierkenntnisse (versuch sie mir aber anzueignen :wink:)
habs aber endlich hinbekommen mit dem LogicalTreeHelper :D

Danke nochmal für deine Hilfe

Lg, Lisanna