2016-02-19 1 views
3

Je vois qu'il existe des moyens de désactiver la sélection dans un ListView, mais je n'ai rien vu pour un TreeView ou Grid.Désactiver la sélection dans TreeView

Ma forme est assez basique et ressemble à ceci:

View of form

Le problème est que quelqu'un peut aller cliquer sur l'une des étiquettes et il semble tout à coup comme ceci:

View of form after selection

Comment puis-je désactiver ce comportement?

<TreeView Focusable="False"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="Focusable" Value="False"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <TreeViewItem Focusable="False"> 
     <TreeViewItem.Header>Group Header</TreeViewItem.Header> 
     <TreeViewItem.IsExpanded>true</TreeViewItem.IsExpanded> 
     <Grid Focusable="False"> 
      <Grid.RowDefinitions> 
       <RowDefinition></RowDefinition> 
       <RowDefinition></RowDefinition> 
       <RowDefinition></RowDefinition> 
       <RowDefinition></RowDefinition> 
       <RowDefinition></RowDefinition> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"></ColumnDefinition> 
       <ColumnDefinition Width="Auto"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Label Content="Message ID"> 
       <Grid.Row>0</Grid.Row> 
       <Grid.Column>0</Grid.Column> 
      </Label> 
      <TextBox Text="{Binding Path=GroupHeader.MessageId}" HorizontalAlignment="Stretch"> 
       <Grid.Column>1</Grid.Column> 
       <Grid.Row>0</Grid.Row> 
      </TextBox> 
      <Label Content="Creation Date"> 
       <Grid.Row>1</Grid.Row> 
       <Grid.Column>0</Grid.Column> 
      </Label> 
      <DatePicker SelectedDate="{Binding Path=GroupHeader.CreationDateTime}"> 
       <Grid.Row>1</Grid.Row> 
       <Grid.Column>1</Grid.Column> 
      </DatePicker> 
      <Label Content="Instructing Agent"> 
       <Grid.Row>2</Grid.Row> 
       <Grid.Column>0</Grid.Column> 
      </Label> 
      <TextBox Text="{Binding Path=GroupHeader.InstructingAgent}"> 
       <Grid.Row>2</Grid.Row> 
       <Grid.Column>1</Grid.Column> 
      </TextBox> 
      <Label Content="Instructed Agent"> 
       <Grid.Row>3</Grid.Row> 
       <Grid.Column>0</Grid.Column> 
      </Label> 
      <TextBox Text="{Binding Path=GroupHeader.InstructedAgent}"> 
       <Grid.Row>3</Grid.Row> 
       <Grid.Column>1</Grid.Column> 
      </TextBox> 
     </Grid> 
    </TreeViewItem> 
    <TreeViewItem> 
     ... 
    </TreeViewItem> 
</TreeView> 

Utilisation du TreeView.ItemContainerStyle désactive simplement sur l'en-tête de l'élément réel, pas le contenu en son sein, il semble.

Mise à jour: J'ai essayé que le commentaire de Chris W et la réponse sur la définition du modèle de contrôle proposé, en utilisant:

<Style x:Key="StretchingTreeViewItemStyle1" TargetType="{x:Type local:StretchingTreeViewItem}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/> 
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/> 
    <Setter Property="Padding" Value="1,0,0,0"/> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="FocusVisualStyle"> 
    <Setter.Value> 
     <Style> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
      <ControlTemplate> 
       <Rectangle/> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:StretchingTreeViewItem}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="19" Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
      </Grid.RowDefinitions> 
      <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"> 
      <ToggleButton.Style> 
       <Style TargetType="{x:Type ToggleButton}"> 
       <Setter Property="Focusable" Value="False"/> 
       <Setter Property="Width" Value="16"/> 
       <Setter Property="Height" Value="16"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ToggleButton}"> 
         <Border Background="Transparent" Height="16" Padding="5" Width="16"> 
         <Path x:Name="ExpandPath" Data="M0,0 L0,6 L6,0 z" Fill="Transparent" Stroke="#FF989898"> 
          <Path.RenderTransform> 
          <RotateTransform Angle="135" CenterY="3" CenterX="3"/> 
          </Path.RenderTransform> 
         </Path> 
         </Border> 
         <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter Property="RenderTransform" TargetName="ExpandPath"> 
          <Setter.Value> 
           <RotateTransform Angle="180" CenterY="3" CenterX="3"/> 
          </Setter.Value> 
          </Setter> 
          <Setter Property="Fill" TargetName="ExpandPath" Value="#FF595959"/> 
          <Setter Property="Stroke" TargetName="ExpandPath" Value="#FF262626"/> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Stroke" TargetName="ExpandPath" Value="#FF1BBBFA"/> 
          <Setter Property="Fill" TargetName="ExpandPath" Value="Transparent"/> 
         </Trigger> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
          <Condition Property="IsMouseOver" Value="True"/> 
          <Condition Property="IsChecked" Value="True"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="Stroke" TargetName="ExpandPath" Value="#FF262626"/> 
          <Setter Property="Fill" TargetName="ExpandPath" Value="#FF595959"/> 
         </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
       </Style> 
      </ToggleButton.Style> 
      </ToggleButton> 
      <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> 
      <ContentPresenter Focusable="False" x:Name="PART_Header" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
      </Border> 
      <ItemsPresenter Focusable="False" x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsExpanded" Value="False"> 
      <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/> 
      </Trigger> 
      <Trigger Property="HasItems" Value="False"> 
      <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/> 
      </Trigger> 
      <!--<Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" TargetName="Bd" 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 Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/> 
      </MultiTrigger>--> 
      <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="VirtualizingPanel.IsVirtualizing" Value="True"> 
     <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
      <VirtualizingStackPanel IsItemsHost="True"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

Le résultat est le texte sur le TreeViewItem lui-même n'est plus sélectionnable/n'est pas mis en surbrillance, mais le contenu peut toujours l'être.

J'ai essayé de régler tout ce que je peux penser à Focusable="False" mais cela ne fonctionne pas non plus, donc je commence à penser qu'il n'est pas lié à la mise au point sur un élément. D'autant plus que si vous avez imbriqué TreeViews vous pouvez avoir à la fois un élément interne et un élément externe sélectionnés en même temps.

+0

Il sera dans le modèle de contrôle par défaut en tant que multitrigueur sur le ToggleButton imbriqué pour le style d'élément sélectionné. Je n'arrive pas à trouver juste un style d'élément wpf treeview par défaut et je suis trop fainéant pour faire un proj wpf juste pour en sortir un mais si vous voulez en partager un, il est assez facile de le repérer. –

Répondre

2

j'ai pu enlever le clou bleu tout en étant capable d'interagir avec les contrôles sous-jacents en utilisant ce TreeView Style:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication1.resoureces"> 
    <SolidColorBrush x:Key="GlyphBrush" Color="#444" /> 
    <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="Transparent"> 
         <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> 
         <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> 
         <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> 
</ResourceDictionary> 

Comme vous pouvez le voir la place J'ai fait un changement commente ce qui suit.

   <!--<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>--> 
+0

C'est la seule solution pour travailler pour moi jusqu'ici, merci! – Logan

2

Comme le commentaire l'indique, il y a deux déclencheurs dans le ControlTemplate par défaut du TreeViewItem qui modifie l'aspect d'un élément lorsqu'il est sélectionné.

En supprimant ces déclencheurs, vous pouvez réaliser ce que vous voulez:

<Window x:Class="TreeViewProblem2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TreeViewProblem2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="TreeViewItemFocusVisual"> 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Rectangle/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.Static.Checked.Fill" Color="#FF595959"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.Static.Checked.Stroke" Color="#FF262626"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.MouseOver.Stroke" Color="#FF27C7F7"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.MouseOver.Fill" Color="#FFCCEEFB"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.MouseOver.Checked.Stroke" Color="#FF1CC4F7"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.MouseOver.Checked.Fill" Color="#FF82DFFB"/> 
     <PathGeometry x:Key="TreeArrow" Figures="M0,0 L0,6 L6,0 z"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.Static.Fill" Color="#FFFFFFFF"/> 
     <SolidColorBrush x:Key="TreeViewItem.TreeArrow.Static.Stroke" Color="#FF818181"/> 
     <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Focusable" Value="False"/> 
      <Setter Property="Width" Value="16"/> 
      <Setter Property="Height" Value="16"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ToggleButton}"> 
         <Border Background="Transparent" Height="16" Padding="5,5,5,5" Width="16"> 
          <Path x:Name="ExpandPath" Data="{StaticResource TreeArrow}" Fill="{StaticResource TreeViewItem.TreeArrow.Static.Fill}" Stroke="{StaticResource TreeViewItem.TreeArrow.Static.Stroke}"> 
           <Path.RenderTransform> 
            <RotateTransform Angle="135" CenterY="3" CenterX="3"/> 
           </Path.RenderTransform> 
          </Path> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsChecked" Value="True"> 
           <Setter Property="RenderTransform" TargetName="ExpandPath"> 
            <Setter.Value> 
             <RotateTransform Angle="180" CenterY="3" CenterX="3"/> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="Fill" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.Static.Checked.Fill}"/> 
           <Setter Property="Stroke" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.Static.Checked.Stroke}"/> 
          </Trigger> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Stroke" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.MouseOver.Stroke}"/> 
           <Setter Property="Fill" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.MouseOver.Fill}"/> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True"/> 
            <Condition Property="IsChecked" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Stroke" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.MouseOver.Checked.Stroke}"/> 
           <Setter Property="Fill" TargetName="ExpandPath" Value="{StaticResource TreeViewItem.TreeArrow.MouseOver.Checked.Fill}"/> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="VerticalContentAlignment" Value="{Binding 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> 
          <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/> 
          <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
           <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
          </Border> 
          <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsExpanded" Value="false"> 
           <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/> 
          </Trigger> 
          <Trigger Property="HasItems" Value="false"> 
           <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="VirtualizingPanel.IsVirtualizing" Value="true"> 
        <Setter Property="ItemsPanel"> 
         <Setter.Value> 
          <ItemsPanelTemplate> 
           <VirtualizingStackPanel/> 
          </ItemsPanelTemplate> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

    <Grid> 
     <TreeView Focusable="False"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="Focusable" Value="False"/> 
       </Style> 
      </TreeView.ItemContainerStyle> 
      <TreeViewItem Focusable="False"> 
       <TreeViewItem.Header>Group Header</TreeViewItem.Header> 
       <TreeViewItem.IsExpanded>true</TreeViewItem.IsExpanded> 
       <Grid Focusable="False"> 
        <Grid.RowDefinitions> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
         <RowDefinition></RowDefinition> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"></ColumnDefinition> 
         <ColumnDefinition Width="Auto"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 
        <Label Content="Message ID"> 
         <Grid.Row>0</Grid.Row> 
         <Grid.Column>0</Grid.Column> 
        </Label> 
        <TextBox Text="{Binding Path=GroupHeader.MessageId}" HorizontalAlignment="Stretch"> 
         <Grid.Column>1</Grid.Column> 
         <Grid.Row>0</Grid.Row> 
        </TextBox> 
        <Label Content="Creation Date"> 
         <Grid.Row>1</Grid.Row> 
         <Grid.Column>0</Grid.Column> 
        </Label> 
        <DatePicker SelectedDate="{Binding Path=GroupHeader.CreationDateTime}"> 
         <Grid.Row>1</Grid.Row> 
         <Grid.Column>1</Grid.Column> 
        </DatePicker> 
        <Label Content="Instructing Agent"> 
         <Grid.Row>2</Grid.Row> 
         <Grid.Column>0</Grid.Column> 
        </Label> 
        <TextBox Text="{Binding Path=GroupHeader.InstructingAgent}"> 
         <Grid.Row>2</Grid.Row> 
         <Grid.Column>1</Grid.Column> 
        </TextBox> 
        <Label Content="Instructed Agent"> 
         <Grid.Row>3</Grid.Row> 
         <Grid.Column>0</Grid.Column> 
        </Label> 
        <TextBox Text="{Binding Path=GroupHeader.InstructedAgent}"> 
         <Grid.Row>3</Grid.Row> 
         <Grid.Column>1</Grid.Column> 
        </TextBox> 
       </Grid> 
      </TreeViewItem> 
     </TreeView> 
    </Grid> 
</Window> 

Cela s'appliquera à tous les TreeViewItem s. Je les mettrais dans un ResourceDictionary puis je les tirerais de là.

Une façon d'obtenir la valeur par défaut ControlTemplate pour l'édition consiste à utiliser Mélange. Voici l'option:

Blend Editing Template

+0

Ok, après avoir essayé cela, tout cela est de désactiver la sélection des en-têtes, mais cela ne désactive pas la sélection du contenu. – Logan

+0

Je ne suis pas d'accord, je l'ai essayé avec votre code spécifique. Mise à jour du code avec la version complète que j'utilise. Je ne suis pas en mesure de sélectionner le 'TreeViewItem' en cliquant sur l'étiquette dans la grille. –

+0

Quelle version de .NET utilisez-vous? – Logan

2

Comme je crois que vous vous remarqué, la façon de désactiver la sélection d'un TreeViewItem particulier est de mettre son Focusable propriété à false. Vous avez obtenu un succès partiel en utilisant TreeView.ItemContainerStyle - cela a entraîné la désactivation de la sélection des éléments de premier niveau, mais pas des éléments imbriqués. Ceci est dû à la façon dont un TreeView est conçu.

TreeViewTreeView est un ItemsControl qui enveloppe ses articles avec des conteneurs TreeViewItem. L'élément clé ici est qu'il ne contient que ses enfants (éléments de premier niveau), donc le TreeView.ItemContainerStyle est seulement appliqué à ses enfants - d'où vos résultats.

TreeViewItem tire aussi de ItemsControl, et il contient ses propres enfants, de sorte que tous les éléments de second niveau sont des enfants (et des objets) de leurs parents de premier niveau, etc. TreeViewItem enveloppe également toutes ses enfants TreeViewItem conteneurs - dans votre cas, le Grid à l'intérieur du TreeViewItem appelé "en-tête de groupe" est enveloppé avec TreeViewItem, que vous pouvez confirmer en utilisant des outils comme Snoop. Donc, afin de désactiver la sélection des éléments de second niveau, vous devez définir TreeViewItem.ItemContainerStyle de tous les éléments parents de premier niveau correspondants comme vous l'avez fait avec votre TreeView.

Sûrement lorsqu'ils traitent avec des arbres à plusieurs niveaux, il peut devenir problématique de définir explicitement TreeViewItem.ItemConainerStyle pour tous les articles, de sorte que vous pouvez utiliser le style implicite:

<TreeView> 
    <TreeView.Resources> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="Focusable" Value="False" /> 
     </Style> 
    </TreeView.Resources> 
    ... 
</TreeView> 

Maintenant, ce style sera appliqué à tous les TreeViewItem contrôles (WRT règles implicites de style) dans le TreeView - important, non seulement ceux de premier niveau. Cela devrait vous obtenir les résultats attendus.