Disable TabStop on Expander
Asked Answered
M

2

8

I set IsTabStop to False, but Tab still navigates to the expander.

Any ideas what am I doing wrong?

<Expander Header="Data" IsTabStop="False">
    <Border Background="White" BorderThickness="0"/>
</Expander>
Maegan answered 16/11, 2010 at 0:1 Comment(0)
D
12

It looks like a bug in the Expander template:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/e51ad4f5-95d3-4c3e-be87-7917e4d81fa0/

Here's a full workaround (ugly, I know):

<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 x:Class="WpfApplication1.MainWindow"
 x:Name="Window"
 Title="MainWindow"
 Width="640" Height="480">
 <Window.Resources>
  <Style x:Key="ExpanderRightHeaderStyle" TargetType="{x:Type ToggleButton}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type ToggleButton}">
      <Border Padding="{TemplateBinding Padding}">
       <Grid SnapsToDevicePixels="False" Background="Transparent">
        <Grid.RowDefinitions>
         <RowDefinition Height="19"/>
         <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid>
         <Grid.LayoutTransform>
          <TransformGroup>
           <TransformGroup.Children>
            <TransformCollection>
             <RotateTransform Angle="-90"/>
            </TransformCollection>
           </TransformGroup.Children>
          </TransformGroup>
         </Grid.LayoutTransform>
         <Ellipse x:Name="circle" Stroke="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" Width="19" Height="19"/>
         <Path x:Name="arrow" Stroke="#666" StrokeThickness="2" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="false" Data="M 1,1.5 L 4.5,5 L 8,1.5"/>
        </Grid>
        <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" RecognizesAccessKey="True"/>
       </Grid>
      </Border>
      <ControlTemplate.Triggers>
       <Trigger Property="IsChecked" Value="true">
        <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
       </Trigger>
       <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#222"/>
       </Trigger>
       <Trigger Property="IsPressed" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/>
        <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style x:Key="ExpanderUpHeaderStyle" TargetType="{x:Type ToggleButton}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type ToggleButton}">
      <Border Padding="{TemplateBinding Padding}">
       <Grid SnapsToDevicePixels="False" Background="Transparent">
        <Grid.ColumnDefinitions>
         <ColumnDefinition Width="19"/>
         <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid>
         <Grid.LayoutTransform>
          <TransformGroup>
           <TransformGroup.Children>
            <TransformCollection>
             <RotateTransform Angle="180"/>
            </TransformCollection>
           </TransformGroup.Children>
          </TransformGroup>
         </Grid.LayoutTransform>
         <Ellipse x:Name="circle" Stroke="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" Width="19" Height="19"/>
         <Path x:Name="arrow" Stroke="#666" StrokeThickness="2" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="false" Data="M 1,1.5 L 4.5,5 L 8,1.5"/>
        </Grid>
        <ContentPresenter HorizontalAlignment="Left" Margin="4,0,0,0" VerticalAlignment="Center" SnapsToDevicePixels="True" Grid.Column="1" RecognizesAccessKey="True"/>
       </Grid>
      </Border>
      <ControlTemplate.Triggers>
       <Trigger Property="IsChecked" Value="true">
        <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
       </Trigger>
       <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#222"/>
       </Trigger>
       <Trigger Property="IsPressed" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/>
        <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style x:Key="ExpanderLeftHeaderStyle" TargetType="{x:Type ToggleButton}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type ToggleButton}">
      <Border Padding="{TemplateBinding Padding}">
       <Grid SnapsToDevicePixels="False" Background="Transparent">
        <Grid.RowDefinitions>
         <RowDefinition Height="19"/>
         <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid>
         <Grid.LayoutTransform>
          <TransformGroup>
           <TransformGroup.Children>
            <TransformCollection>
             <RotateTransform Angle="90"/>
            </TransformCollection>
           </TransformGroup.Children>
          </TransformGroup>
         </Grid.LayoutTransform>
         <Ellipse x:Name="circle" Stroke="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" Width="19" Height="19"/>
         <Path x:Name="arrow" Stroke="#666" StrokeThickness="2" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="false" Data="M 1,1.5 L 4.5,5 L 8,1.5"/>
        </Grid>
        <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" RecognizesAccessKey="True"/>
       </Grid>
      </Border>
      <ControlTemplate.Triggers>
       <Trigger Property="IsChecked" Value="true">
        <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
       </Trigger>
       <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#222"/>
       </Trigger>
       <Trigger Property="IsPressed" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/>
        <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style x:Key="ExpanderHeaderFocusVisual">
   <Setter Property="Control.Template">
    <Setter.Value>
     <ControlTemplate>
      <Border>
       <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="0" SnapsToDevicePixels="true"/>
      </Border>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style x:Key="ExpanderDownHeaderStyle" TargetType="{x:Type ToggleButton}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type ToggleButton}">
      <Border Padding="{TemplateBinding Padding}">
       <Grid SnapsToDevicePixels="False" Background="Transparent">
        <Grid.ColumnDefinitions>
         <ColumnDefinition Width="19"/>
         <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Ellipse x:Name="circle" Stroke="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" Width="19" Height="19"/>
        <Path x:Name="arrow" Stroke="#666" StrokeThickness="2" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="false" Data="M 1,1.5 L 4.5,5 L 8,1.5"/>
        <ContentPresenter HorizontalAlignment="Left" Margin="4,0,0,0" VerticalAlignment="Center" SnapsToDevicePixels="True" Grid.Column="1" RecognizesAccessKey="True"/>
       </Grid>
      </Border>
      <ControlTemplate.Triggers>
       <Trigger Property="IsChecked" Value="true">
        <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
       </Trigger>
       <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#222"/>
       </Trigger>
       <Trigger Property="IsPressed" Value="true">
        <Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/>
        <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
        <Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style x:Key="ExpanderStyle1" TargetType="{x:Type Expander}">
   <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
   <Setter Property="Background" Value="Transparent"/>
   <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
   <Setter Property="VerticalContentAlignment" Value="Stretch"/>
   <Setter Property="BorderBrush" Value="Transparent"/>
   <Setter Property="BorderThickness" Value="1"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Expander}">
      <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
       <DockPanel>
        <ToggleButton x:Name="HeaderSite" Focusable="{TemplateBinding Focusable}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" Margin="1" MinHeight="0" MinWidth="0" Style="{StaticResource ExpanderDownHeaderStyle}" Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" DockPanel.Dock="Top"/>
        <ContentPresenter x:Name="ExpandSite" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Focusable="false" Visibility="Collapsed" DockPanel.Dock="Bottom"/>
       </DockPanel>
      </Border>
      <ControlTemplate.Triggers>
       <Trigger Property="IsExpanded" Value="true">
        <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
       </Trigger>
       <Trigger Property="ExpandDirection" Value="Right">
        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/>
        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/>
        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderRightHeaderStyle}"/>
       </Trigger>
       <Trigger Property="ExpandDirection" Value="Up">
        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/>
        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/>
        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderUpHeaderStyle}"/>
       </Trigger>
       <Trigger Property="ExpandDirection" Value="Left">
        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/>
        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Right"/>
        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderLeftHeaderStyle}"/>
       </Trigger>
       <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </Window.Resources>

 <Grid x:Name="LayoutRoot">
  <Expander Focusable="False" Margin="68,81,293,0" VerticalAlignment="Top" Height="77" Header="Expander" Style="{DynamicResource ExpanderStyle1}">
   <Grid/>
  </Expander>
 </Grid>
</Window>
Dvorak answered 16/11, 2010 at 0:14 Comment(0)
S
0

followed link shared above and was able to fix similar situation: working in a very powerful application but, as such, is complex. Have Expander implemented with a corresponding template applied.

That Expander wrapples multiple nested controls which in turn have other controls. We want keyboard navigation like using Tab not to go through Expender Header which provides view title but were unable to do that.

With information you shared was able to set appropriate value at expander and avoid focusing at Expander Header while keeping it reusable at other views. So implemented it adding following code at template's ToggleButton

Focusable="{TemplateBinding Focusable}"

And add a binding at view where Expander is used:

<Expander x:Name="Expander" Background="Transparent" HorizontalAlignment="Stretch" IsExpanded="{Binding   IsExpanded}" Template="{StaticResource ExpanderBugFixTemplate}" Focusable="False">

Thanks!

Semicolon answered 7/2, 2023 at 14:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.