2016-02-19 147 views
3

我看到有方法可以禁用ListView中的選擇,但我還沒有看到TreeViewGrid的任何內容。在TreeView中禁用選擇

我的形式是很基本的,看起來像這樣:

View of form

問題是有人可以去點擊其中任何一個標籤,突然它看起來像這樣:

View of form after selection

如何禁用此行爲?

<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> 

使用TreeView.ItemContainerStyle只是禁用它在實際的項目頭,而不是在它的內容似乎。

更新:我試着從克里斯·W上的評論和有關設置控件模板的回答表明,使用以下:

<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> 

結果是對TreeViewItem本身的文字不再是可選/不會突出顯示,但其中的內容仍然可以。

我試過設置一切我能想到的Focusable="False",但那也行不通,所以我開始認爲它不關注焦點在一個項目上。特別是因爲如果你嵌套TreeViews你可以同時選擇一個內部和一個外部項目。

+0

它將在默認控制模板中作爲選擇項目樣式的嵌套ToggleButton上的多觸發器。我似乎無法找到一個默認的WPF樹視圖項目樣式,並且我懶得去製作一個wpf proj只是爲了拉出一個,但如果你想共享一個,很容易發現它在那裏。 –

回答

2

我能取下藍色的亮點,同時仍然能夠使用此樹視圖樣式的基本控件交互:

<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> 

,你可以看到的地方我做了一個改變,正在評論以下內容。

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

這是迄今爲止唯一的解決方案爲我工作,謝謝! – Logan

2

正如評論所說,TreeViewItem的默認ControlTemplate中有兩個觸發器,它在選中它時會改變項目的外觀。

通過刪除那些你可以實現你想要的觸發器:

<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> 

這將適用於所有TreeViewItem秒。我把這些放在ResourceDictionary裏,然後把它們從那裏拉出來。

獲取編輯的默認ControlTemplate的一種方法是使用Blend。下面是選項:

Blend Editing Template

+0

好吧,嘗試完成後,所有這些都會禁用標題選擇,但不會禁用內容選擇。 – Logan

+0

我懇求不同,試用了你的特定代碼。使用我正在使用的整個版本更新了代碼。我無法通過單擊網格中的標籤來選擇「TreeViewItem」。 –

+0

您使用的是什麼版本的.NET? – Logan

2

我相信,正如你注意到自己,禁用特定TreeViewItem的選擇的方法是將它的Focusable屬性false。利用TreeView.ItemContainerStyle已取得部分成功 - 這導致禁用第一級項目的選擇,但不是嵌套項目的選擇。這是由TreeView的設計方式造成的。

TreeView基本上是一個ItemsControl它包裝它的項目與TreeViewItem容器。關鍵在於它只包含它的孩子(第一級項目),所以TreeView.ItemContainerStyle只適用於它的孩子 - 因此你的結果。

TreeViewItemItemsControl派生,它包含自己的孩子,所以,所有二級項目是兒童(和項目)的一級父母等TreeViewItem也封裝了所有它的孩子TreeViewItem容器 - 你情況下,Grid裏面的TreeViewItem被稱爲「Group Header」,包裝爲TreeViewItem,您可以使用Snoop等工具進行確認。因此,爲了禁止選擇二級項目,您應該設置TreeViewItem.ItemContainerStyle所有相應的一級父項目,就像您對TreeView所做的那樣。

當然多層次的樹木打交道時,可能會出現問題明確設置TreeViewItem.ItemConainerStyle的所有項目,這樣你就可以使用隱式樣式:

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

現在這個樣式將被應用到所有TreeViewItem控制(WRT隱式樣式規則)在TreeView之內 - 重要的是,不僅是第一級的。這應該會讓你獲得預期的結果。