{"id":156,"date":"2016-08-08T17:20:20","date_gmt":"2016-08-08T15:20:20","guid":{"rendered":"http:\/\/dtp-soft.de\/?p=156"},"modified":"2016-08-08T17:20:36","modified_gmt":"2016-08-08T15:20:36","slug":"wpf-treeview-mit-highlighting","status":"publish","type":"post","link":"http:\/\/dtp-soft.de\/?p=156","title":{"rendered":"WPF: TreeView mit Highlighting"},"content":{"rendered":"<p>Leider hat der normale <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/system.windows.controls.treeview.aspx\">WPF-TreeView<\/a> keine einfache Eigenschaft, mit der man das <a href=\"https:\/\/msdn.microsoft.com\/de-de\/library\/system.windows.forms.treeview.hottracking(v=vs.110).aspx\">HotTracking<\/a>, welches man aus Windows.Forms kennt aktivieren kann. Einen Weg gibt es daf\u00fcr nat\u00fcrlich trotzdem. Man muss einen Stil erstellen in dem die TreeViewItems sich highlighten, wenn sie ein MouseOver haben.<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Style f\u00fcr TreeView Highlighting\">&lt;Style TargetType=\"TreeViewItem\" x:Key=\"TreeViewHighlighting\"&gt;\r\n  &lt;Setter Property=\"HeaderTemplate\"&gt;\r\n    &lt;Setter.Value&gt;\r\n      &lt;DataTemplate&gt;\r\n        &lt;Border&gt;\r\n          &lt;TextBlock Text=\"{Binding}\"\/&gt;\r\n          &lt;Border.Style&gt;\r\n            &lt;Style TargetType=\"Border\"&gt;\r\n              &lt;Setter Property=\"BorderThickness\" Value=\"1\"\/&gt;\r\n              &lt;Setter Property=\"BorderBrush\" Value=\"Transparent\"\/&gt;\r\n              &lt;Style.Triggers&gt;\r\n                &lt;MultiDataTrigger&gt;\r\n                  &lt;MultiDataTrigger.Conditions&gt;\r\n                    &lt;Condition Binding=\"{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}\" Value=\"True\"\/&gt;\r\n                    &lt;Condition Binding=\"{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsSelected}\" Value=\"False\"\/&gt;\r\n                  &lt;\/MultiDataTrigger.Conditions&gt;\r\n                  &lt;Setter Property=\"Background\" Value=\"#ffe5f3fb\"\/&gt;\r\n                  &lt;Setter Property=\"BorderBrush\" Value=\"#ffa5d7f0\"\/&gt;\r\n                &lt;\/MultiDataTrigger&gt;\r\n              &lt;\/Style.Triggers&gt;\r\n            &lt;\/Style&gt;\r\n          &lt;\/Border.Style&gt;\r\n        &lt;\/Border&gt;\r\n      &lt;\/DataTemplate&gt;\r\n    &lt;\/Setter.Value&gt;\r\n  &lt;\/Setter&gt;\r\n&lt;\/Style&gt;<\/pre>\n<p>Nun muss man diesen Stil dem TreeView zuordnen. Das kann man entweder im XAML-Code machen:<\/p>\n<pre class=\"lang:xhtml decode:true \" title=\"Zuweisung direkt im XAML-Code\">&lt;TreeView&gt;\r\n   &lt;TreeView.Resources&gt;\r\n       &lt;Style TargetType=\"TreeViewItem\"&gt;\r\n          ...\r\n       &lt;\/Style&gt;\r\n   &lt;\/TreeView.Resources&gt;\r\n   &lt;TreeViewItem Header=\"Knoten 1\"&gt;\r\n      &lt;TreeViewItem Header=\"Knoten 1.1\" \/&gt;\r\n      &lt;TreeViewItem Header=\"Knoten 1.2\"\/&gt;\r\n   &lt;\/TreeViewItem&gt;\r\n   &lt;TreeViewItem Header=\"Knoten 2\"&gt;\r\n   &lt;\/TreeViewItem&gt;\r\n&lt;\/TreeView&gt;<\/pre>\n<p>Oder man das das im Code behinde machen, indem man den Stil jedem Eintrag zuordnet: (In diesem Fall in einer abgeleiteten Klasse)<\/p>\n<pre class=\"lang:c# decode:true \" title=\"Zuweisung im Code\">using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Windows.Media;\r\nusing System.Windows;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Windows.Controls;\r\n\r\nnamespace MyNamespace\r\n{\r\n  \/\/\/ &lt;summary&gt;\r\n  \/\/\/ Der HighlightingTreeView ist eine Erweiterung des normalen TreeViews, so dass die Elemente hervorgehoben werden, \u00fcber denen die Maus steht.\r\n  \/\/\/ &lt;\/summary&gt;\r\n  class HighlightingTreeView: TreeView\r\n  {\r\n\r\n    \/\/\/ &lt;summary&gt;Erzeugt ein neues HighlightingTreeView-Objekt&lt;\/summary&gt;\r\n    public HighlightingTreeView()\r\n    {\r\n      SetDefaults();\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;Setzt Standardwerte f\u00fcr Hintergrund und Rahmen&lt;\/summary&gt;\r\n    private void SetDefaults()\r\n    {\r\n      this.Background = Brushes.AliceBlue;\r\n      this.BorderBrush = Brushes.Transparent;\r\n    }\r\n\r\n    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n    {\r\n      base.OnItemsChanged(e);\r\n\r\n      object style = (Style)Application.Current.FindResource(\"TreeViewHighlighting\");\r\n      if (style != null &amp;&amp; style.GetType() == typeof(Style))\r\n      {\r\n        ApplyStyleToItems(this.Items, (Style)style);\r\n      }\r\n    }\r\n\r\n    private void ApplyStyleToItems(ItemCollection items, Style style)\r\n    {\r\n      foreach (TreeViewItem tvi in items)\r\n      {\r\n        tvi.Style = (Style)style;\r\n        if (tvi.HasItems)\r\n        {\r\n          ApplyStyleToItems(tvi.Items, style);\r\n        }\r\n      }\r\n    }\r\n\r\n  }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Leider hat der normale WPF-TreeView keine einfache Eigenschaft, mit der man das HotTracking, welches man aus Windows.Forms kennt aktivieren kann. Einen Weg gibt es daf\u00fcr nat\u00fcrlich trotzdem. Man muss einen Stil erstellen in dem die TreeViewItems sich highlighten, wenn sie ein MouseOver haben. &lt;Style TargetType=&#8220;TreeViewItem&#8220; x:Key=&#8220;TreeViewHighlighting&#8220;&gt; &lt;Setter Property=&#8220;HeaderTemplate&#8220;&gt; &lt;Setter.Value&gt; &lt;DataTemplate&gt; &lt;Border&gt; &lt;TextBlock Text=&#8220;{Binding}&#8220;\/&gt; &lt;Border.Style&gt; &lt;Style&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,26],"tags":[],"class_list":["post-156","post","type-post","status-publish","format-standard","hentry","category-c","category-wpf"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=156"}],"version-history":[{"count":1,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/156\/revisions"}],"predecessor-version":[{"id":157,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=\/wp\/v2\/posts\/156\/revisions\/157"}],"wp:attachment":[{"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=156"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dtp-soft.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}