2016-10-11 10 views
0

wpf treeview HierarchicalDataTemplateのデフォルトノードリンクをconverter.Butの助けを借りて変更しようとしていますが、ツリービューノードリンクのデフォルトの外観を変更できません。私は以下のリソースコードの助けを借りてこれを達成しようとしましたが、ノードのデフォルトの外観は何のエラーもスローされませんが変更されていません。私は.Iはラインツリービューコントロールのwpfデフォルトノードリンク線を変更できません

<UserControl x:Class="DevLake.OrgChart.UI.View.TreeView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:local="clr-namespace:DevLake.OrgChart.UI.View" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"> 

    <UserControl.Resources> 
     <local:TreeViewLineConverter x:Key="LineConverter"/> 

     <SolidColorBrush x:Key="GlyphBrush" Color="#444" /> 

     <!--================================================================= 
     TreeViewItem 
    ==================================================================--> 
     <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton"> 
      <Setter Property="Focusable" Value="False"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToggleButton"> 
         <Grid 
       Width="15" 
       Height="13" 
       Background="White"> 
          <Path x:Name="ExpandPath" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center" 
       Margin="1,1,1,1" 
       Fill="{StaticResource GlyphBrush}" 
       Data="M 4 0 L 8 4 L 4 8 Z"/> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsChecked" 
        Value="True"> 
           <Setter Property="Data" 
        TargetName="ExpandPath" 
        Value="M 0 4 L 8 4 L 4 8 Z"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="TreeViewItemFocusVisual"> 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Border> 
          <Rectangle Margin="0,0,0,0" 
        StrokeThickness="5" 
        Stroke="Black" 
        StrokeDashArray="1 2" 
        Opacity="0"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="{x:Type TreeViewItem}" 
     TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="Background" 
      Value="Transparent"/> 
      <Setter Property="HorizontalContentAlignment" 
      Value="{Binding Path=HorizontalContentAlignment, 
       RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="VerticalContentAlignment" 
      Value="{Binding Path=VerticalContentAlignment, 
       RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="Padding" 
      Value="1,0,0,0"/> 
      <Setter Property="Foreground" 
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
      <Setter Property="FocusVisualStyle" 
      Value="{StaticResource TreeViewItemFocusVisual}"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TreeViewItem}"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition MinWidth="19" 
          Width="Auto"/> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition/> 
          </Grid.RowDefinitions> 

          <!-- Connecting Lines --> 
          <Rectangle x:Name="HorLn" Height="1" Stroke="#8888" Margin="10,0,0,0" SnapsToDevicePixels="true"/> 
          <Rectangle x:Name="VerLn" Width="1" Stroke="#8888" Grid.RowSpan="2" SnapsToDevicePixels="true"/> 
          <ToggleButton x:Name="Expander" 
         Style="{StaticResource ExpandCollapseToggleStyle}" 
         IsChecked="{Binding Path=IsExpanded, 
           RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"/> 
          <Border Name="Bd" 
        Grid.Column="1" 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Padding="{TemplateBinding Padding}"> 
           <ContentPresenter x:Name="PART_Header" 
          ContentSource="Header" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
          </Border> 
          <ItemsPresenter x:Name="ItemsHost" 
         Grid.Row="1" 
         Grid.Column="1" 
         Grid.ColumnSpan="2"/> 
         </Grid> 
         <ControlTemplate.Triggers> 

          <!-- This trigger changes the connecting lines if the item is the last in the list --> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource LineConverter}}" Value="true"> 
           <Setter TargetName="VerLn" 
        Property="Height" 
        Value="6"/> 
           <Setter TargetName="VerLn" 
        Property="VerticalAlignment" 
        Value="Top"/> 
          </DataTrigger> 
          <Trigger Property="IsExpanded" 
        Value="false"> 
           <Setter TargetName="ItemsHost" 
        Property="Visibility" 
        Value="Collapsed"/> 
          </Trigger> 
          <Trigger Property="HasItems" 
        Value="false"> 
           <Setter TargetName="Expander" 
        Property="Visibility" 
        Value="Hidden"/> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="HasHeader" 
         Value="false"/> 
            <Condition Property="Width" 
         Value="Auto"/> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="PART_Header" 
        Property="MinWidth" 
        Value="75"/> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="HasHeader" 
         Value="false"/> 
            <Condition Property="Height" 
         Value="Auto"/> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="PART_Header" 
        Property="MinHeight" 
        Value="19"/> 
          </MultiTrigger> 
          <Trigger Property="IsSelected" 
        Value="true"> 
           <Setter TargetName="Bd" 
        Property="Background" 
        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
           <Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsSelected" 
         Value="true"/> 
            <Condition Property="IsSelectionActive" 
         Value="false"/> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" 
        Property="Background" 
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
           <Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" 
        Value="false"> 
           <Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </UserControl.Resources> 

    <StackPanel> 
     <TreeView x:Name="tvMain" ItemsSource="{Binding Root}" BorderThickness="0"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="{Binding ImagePath}" MaxHeight="40" MaxWidth="40" Margin="2"/> 
         <TextBlock VerticalAlignment="Center">    
         <TextBlock.Text> 
          <MultiBinding StringFormat=" {0} {1}"> 
           <Binding Path="FirstName"/> 
           <Binding Path="LastName"/> 
          </MultiBinding> 


         </TextBlock.Text> 
         </TextBlock> 
         <StackPanel.Style> 
          <Style> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding IsSelected}" Value="true"> 
             <Setter Property="StackPanel.Background" Value="LightBlue"/> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </StackPanel.Style> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsExpanded" Value="True"/> 
        <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
       </Style> 
      </TreeView.ItemContainerStyle> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectedItemChanged"> 
        <i:InvokeCommandAction Command="{Binding SelectedCommand}" 
              CommandParameter="{Binding ElementName=tvMain, Path=SelectedItem}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </TreeView> 
    </StackPanel> 
</UserControl> 

とリンクノードを表示したいと私の変換コードがリンクするノードのデフォルトの外観を変更するには助けてください:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace DevLake.OrgChart.UI.View 
{ 
    /// <summary> 
    /// Interaction logic for TreeView.xaml 
    /// </summary> 
    public partial class TreeView : UserControl 
    { 
     public TreeView() 
     { 
      InitializeComponent(); 
     } 
    } 

    class TreeViewLineConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      TreeViewItem item = (TreeViewItem)value; 
      ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item); 
      return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new Exception("The method or operation is not implemented."); 
     } 
    } 
} 

答えて

0

あなたはオーバーライドTreeView.ItemContainerStyleを持っています。 BasedOnプロパティを使用して、線が定義されている基本スタイルを適用します。

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
     <Setter Property="IsExpanded" Value="True"/> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
</TreeView.ItemContainerStyle> 
関連する問題