Preventing a WPF Expander from expanding when header is clicked
There is actually a much simpler XAML solution than modifying templates. Simply DON'T use the Expander's header property in this case. Instead, cover the expander with your own styled TextBlock.
<Application.Resources> <Style x:Key="ExpanderHeader" TargetType="{x:Type TextBlock}"> <Setter Property="Height" Value="22" /> <Setter Property="Margin" Value="21,0,0,0" /> <Setter Property="Padding" Value="9,3,0,0" /> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="VerticalAlignment" Value="Top" /> </Style></Application.Resources><Grid> <Expander> <TextBlock Text="I am some content. I have disowned my default header." Margin="10,5" /> </Expander> <TextBlock Text="I'm filling in for the default header. You'll like me better anyway." Style="{StaticResource ResourceKey=ExpanderHeader}"/></Grid>
The header is the button that creates the event, so you need to change the template for your Expander to just have the expander icon as the button.
Here is a post of how to change the expander.
I modified the default template for the Expander
control as suggested by Simeon.
The following ControlTemplate
defines an expander, which only reacts (expands/collapses) when the user clicks on the header icon.
This is quick and dirty so expect it to break.
<ControlTemplate x:Key="LazyExpanderTemplate" TargetType="Expander"> <Border BorderThickness="{TemplateBinding Border.BorderThickness}" CornerRadius="3,3,3,3" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True"> <DockPanel> <DockPanel DockPanel.Dock="Top" Name="HeaderSite"> <ToggleButton DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}" Foreground="{TemplateBinding TextElement.Foreground}" FontFamily="{TemplateBinding TextElement.FontFamily}" FontSize="{TemplateBinding TextElement.FontSize}" FontStretch="{TemplateBinding TextElement.FontStretch}" FontStyle="{TemplateBinding TextElement.FontStyle}" FontWeight="{TemplateBinding TextElement.FontWeight}" HorizontalContentAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding Control.VerticalContentAlignment}" Padding="{TemplateBinding Control.Padding}" MinWidth="0" MinHeight="0" Margin="1,1,1,1" > <ToggleButton.Style> <Style TargetType="ToggleButton"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border Padding="{TemplateBinding Control.Padding}"> <Grid Background="#00FFFFFF" SnapsToDevicePixels="False"> <Grid.ColumnDefinitions> <ColumnDefinition Width="19" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Ellipse Name="shadow" Width="17" Height="17" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden" /> <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="ToggleButton.IsChecked" Value="True" > <Setter Property="Path.Data" TargetName="arrow"> <Setter.Value> <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry> </Setter.Value> </Setter> </Trigger> <Trigger Property="UIElement.IsMouseOver" Value="True"> <Setter Property="Shape.Stroke" TargetName="circle"> <Setter.Value> <SolidColorBrush>#FF666666</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="Shape.Stroke" TargetName="arrow"> <Setter.Value> <SolidColorBrush>#FF222222</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="UIElement.Visibility" TargetName="shadow"> <Setter.Value> <x:Static Member="Visibility.Visible" /> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ToggleButton.Style> <ToggleButton.FocusVisualStyle> <Style TargetType="IFrameworkInputElement"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Border> <Rectangle Stroke="#FF000000" StrokeThickness="1" StrokeDashArray="1 2" Margin="0,0,0,0" SnapsToDevicePixels="True" /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ToggleButton.FocusVisualStyle> </ToggleButton> <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding HeaderedContentControl.Header}" ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" ContentStringFormat="{TemplateBinding HeaderedContentControl.HeaderStringFormat}" Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" SnapsToDevicePixels="True" /> </DockPanel> <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Name="ExpandSite" Margin="{TemplateBinding Control.Padding}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" Visibility="Collapsed" Focusable="False" DockPanel.Dock="Bottom" /> </DockPanel> </Border> <ControlTemplate.Triggers> <Trigger Property="Expander.IsExpanded"> <Setter Property="UIElement.Visibility" TargetName="ExpandSite"> <Setter.Value> <x:Static Member="Visibility.Visible" /> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> <Trigger Property="Expander.ExpandDirection" Value="Right"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/> <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/> <Setter Property="FrameworkElement.Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="ToggleButton"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border Padding="{TemplateBinding Control.Padding}"> <Grid Background="#00FFFFFF" SnapsToDevicePixels="False"> <Grid.RowDefinitions> <RowDefinition Height="19" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <TransformGroup.Children> <RotateTransform Angle="-90" /> </TransformGroup.Children> </TransformGroup> </Grid.LayoutTransform> <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Ellipse Name="shadow" Width="17" Height="17" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden" /> <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" /> </Grid> <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="0,4,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="ToggleButton.IsChecked"> <Setter Property="Path.Data" TargetName="arrow"> <Setter.Value> <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> <Trigger Property="UIElement.IsMouseOver"> <Setter Property="Shape.Stroke" TargetName="circle"> <Setter.Value> <SolidColorBrush>#FF666666</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="Shape.Stroke" TargetName="arrow"> <Setter.Value> <SolidColorBrush>#FF222222</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="UIElement.Visibility" TargetName="shadow"> <Setter.Value> <x:Static Member="Visibility.Visible" /> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> </Trigger> <Trigger Property="Expander.ExpandDirection"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/> <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/> <Setter Property="FrameworkElement.Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="ToggleButton"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border Padding="{TemplateBinding Control.Padding}"> <Grid Background="#00FFFFFF" SnapsToDevicePixels="False"> <Grid.ColumnDefinitions> <ColumnDefinition Width="19" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <TransformGroup.Children> <RotateTransform Angle="180" /> </TransformGroup.Children> </TransformGroup> </Grid.LayoutTransform> <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Ellipse Name="shadow" Width="17" Height="17" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden" /> <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" /> </Grid> <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" SnapsToDevicePixels="True" Grid.Column="1" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="ToggleButton.IsChecked"> <Setter Property="Path.Data" TargetName="arrow"> <Setter.Value> <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> <Trigger Property="UIElement.IsMouseOver"> <Setter Property="Shape.Stroke" TargetName="circle"> <Setter.Value> <SolidColorBrush>#FF666666</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="Shape.Stroke" TargetName="arrow"> <Setter.Value> <SolidColorBrush>#FF222222</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="UIElement.Visibility" TargetName="shadow"> <Setter.Value> <x:Static Member="Visibility.Visible" /> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> <Trigger.Value> <x:Static Member="ExpandDirection.Up" /> </Trigger.Value> </Trigger> <Trigger Property="Expander.ExpandDirection"> <Setter Property="DockPanel.Dock" TargetName="ExpandSite"> <Setter.Value> <x:Static Member="Dock.Left" /> </Setter.Value> </Setter> <Setter Property="DockPanel.Dock" TargetName="HeaderSite"> <Setter.Value> <x:Static Member="Dock.Right" /> </Setter.Value> </Setter> <Setter Property="FrameworkElement.Style" TargetName="HeaderSite"> <Setter.Value> <Style TargetType="ToggleButton"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border Padding="{TemplateBinding Control.Padding}"> <Grid Background="#00FFFFFF" SnapsToDevicePixels="False"> <Grid.RowDefinitions> <RowDefinition Height="19" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid> <Grid.LayoutTransform> <TransformGroup> <TransformGroup.Children> <RotateTransform Angle="90" /> </TransformGroup.Children> </TransformGroup> </Grid.LayoutTransform> <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Ellipse Name="shadow" Width="17" Height="17" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden" /> <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" /> </Grid> <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="0,4,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="ToggleButton.IsChecked"> <Setter Property="Path.Data" TargetName="arrow"> <Setter.Value> <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> <Trigger Property="UIElement.IsMouseOver"> <Setter Property="Shape.Stroke" TargetName="circle"> <Setter.Value> <SolidColorBrush>#FF666666</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="Shape.Stroke" TargetName="arrow"> <Setter.Value> <SolidColorBrush>#FF222222</SolidColorBrush> </Setter.Value> </Setter> <Setter Property="UIElement.Visibility" TargetName="shadow"> <Setter.Value> <x:Static Member="Visibility.Visible" /> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>True</s:Boolean> </Trigger.Value> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> <Trigger.Value> <x:Static Member="ExpandDirection.Left" /> </Trigger.Value> </Trigger> <Trigger Property="UIElement.IsEnabled"> <Setter Property="TextElement.Foreground"> <Setter.Value> <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> </Setter.Value> </Setter> <Trigger.Value> <s:Boolean>False</s:Boolean> </Trigger.Value> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>