Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[solved] Problem mit TreeView und Drag-n-Drop
Hunv
myCSharp.de - Member

Avatar #avatar-3429.png


Dabei seit:
Beiträge: 195

Themenstarter:

[solved] Problem mit TreeView und Drag-n-Drop

beantworten | zitieren | melden

Hi

ich habe folgendes Problem. Ich habe in WPF ein Treeview erstellt, welches noch ein paar mehr Funktionalitäten hat. Dazu habe ich ein eigenes TreeViewItem erstellt, welches u.a. ein Icon anzeigen kann. Auch Drag-n-Drop ist implementiert um ein Eintrag an eine andere Stelle im TreeView ziehen zu können.
Die Einträge des Treeviews werden via TreeView.Resources angezeigt und in mein TreeViewItem "umgewandelt".

Nun habe ich das Problem, dass die Root-Elemente des Treeviews dieses Style nicht annehmen. Alle andere TreeViewItems, die den Root-Elementen untergeordnet sind, zeigen das Style korrekt an. Die Root-Elemente werden also z.B. ohne Icon als standard TreeViewItem angezeigt.
Wenn ich den letzten Teil für das Drag-n-Drop rausnehme (den Teil mit TreeView.ItemContainerStyle), dann wird alles korrekt angezeigt, aber Drag-n-Drop funktioniert natürlich nicht mehr.

Hat jemand eine Idee warum das Verhalten so ist und was ich dagegen tun kann?

Hier der XAML-Code:
<my:ImagedConnectionTreeViewControl Background="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,-2,0,0" x:Name="tvConnectionList" BorderThickness="0" SelectedItemChanged="tvConnectionList_SelectedItemChanged" AllowDrop="True" >
	<TreeView.ContextMenu>
		<ContextMenu>
			<MenuItem Command="my:ImagedConnectionTreeView.AddFolder" Header="Add Folder" IsEnabled="True" />
			<MenuItem Command="my:ImagedConnectionTreeView.AddSetting" Header="Add Connection" IsEnabled="True" />
		</ContextMenu>
	</TreeView.ContextMenu>
	<TreeView.Resources>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<Setter Property="HeaderedItemsControl.HeaderTemplate">
				<Setter.Value>
					<DataTemplate>
						<StackPanel Orientation="Horizontal"
									Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}">
							<Image Height="16" Source="{Binding Path=Icon, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}" Stretch="Fill" Width="16" />
							<TextBlock Text="{Binding}" />
						</StackPanel>
					</DataTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</TreeView.Resources>
	<TreeView.ItemContainerStyle>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
			<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
			<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
		</Style>
	</TreeView.ItemContainerStyle>
</my:ImagedConnectionTreeViewControl>
Visit me @ www.beremote.net
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

Du musst nicht das DragEnter jedes einzelnen TreeviewItems behandeln, du kannst das DragEnter des Treeview insgesamt behandeln - der sendet für jedes Item ein DragEnter, wenn das Draggin dieses Item entert. Weil das ist ja ein RoutedEvent.
Dein coden eines speziellen TreeviewItems scheint mir auch abenteuerlich - mach dich mal über MVVM schlau, weil normalerweise braucht man sowas nicht, wenn man nachm MVVM-Pattrn vorgeht.
gugge vlt. WpfTreeview-Tut - aber da ist das Viewmodel in VB gecodet.

oder gugge Simplifying the WPF TreeView by Using the ViewModel Pattern
dassis c#, aber englisch.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Hunv
myCSharp.de - Member

Avatar #avatar-3429.png


Dabei seit:
Beiträge: 195

Themenstarter:

beantworten | zitieren | melden

Hi ErfinderDesRades,

noch eine Kurze Rückmeldung:
der Hinweis mit nicht jedes einzelne Item behandeln war die Lösung, danke!
Dass das MVVM-Pattern derzeit nicht ganz eingehalten wird, ist mir bewusst. Das ist mein erstes WPF-Projekt und die Erfahrung wächst mit der Zeit. Wenn ich weiß was ich tue, werde ich das Control auch nochmal neu schreiben, aber im Moment muss es erstmal nur laufen ;)

Zu Vollständigkeit:
Nachdem ich
<TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.ItemContainerStyle>
durch
<TreeView.Style>
                <Style TargetType="{x:Type my:ImagedConnectionTreeViewControl}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.Style>
ersetzt habe, war alles wie gewünscht!

Danke nochmal!
Visit me @ www.beremote.net
private Nachricht | Beiträge des Benutzers