如何样式WPF扩展器头?

我想在WPF扩展头上应用样式。 在下面的XAML中,我有一个扩展器,但是它的样式不仅适用于标题。

谢谢。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="640" > <StackPanel> <StackPanel.Resources> <Style TargetType="Expander"> <Style.Resources> <LinearGradientBrush x:Key="BackBrush" StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="#EF3132" Offset="0.1" /> <GradientStop Color="#D62B2B" Offset="0.9" /> </LinearGradientBrush> </Style.Resources> <Setter Property="Background" Value="{StaticResource BackBrush}"/> </Style> </StackPanel.Resources> <Expander> <StackPanel> <TextBlock>Bike</TextBlock> <TextBlock>Car</TextBlock> <TextBlock>Truck</TextBlock> </StackPanel> </Expander> </StackPanel> </Page> 

我已经结合了Josh Smith和MSDN的一些XAML,并提出了一个解决scheme。 事实上,控制(至less是标题)必须重新devise。

 <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400"> <StackPanel> <StackPanel.Resources> <Style TargetType="Border" x:Key="RacePitBorderStyle" > <Style.Resources> <LinearGradientBrush x:Key="BackBrush" StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="#EF3132" Offset="0.1" /> <GradientStop Color="#D62B2B" Offset="0.9" /> </LinearGradientBrush> </Style.Resources> <Setter Property="Background" Value="{StaticResource BackBrush}"/> </Style> <DataTemplate x:Key="titleText"> <Border Style="{StaticResource RacePitBorderStyle}" Height="24"> <TextBlock Text="{Binding}" Margin="4 0" VerticalAlignment="Center" Foreground="White" FontSize="11" FontWeight="Normal" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=ActualWidth}" TextWrapping="Wrap"/> </Border> </DataTemplate> <Style TargetType="{x:Type Expander}"> <Setter Property="HeaderTemplate" Value="{StaticResource titleText}"/> </Style> </StackPanel.Resources> <Expander Name="hcontCtrl" Header="This is the header."> <StackPanel> <TextBox>This is a textbox</TextBox> <Button>A button</Button> </StackPanel> </Expander> </StackPanel> </Page> 

我认为Vasile的回答是正确的,但它似乎比原来需要的海报要多得多。 所有原来的问题是要做的是改变标题的背景。 虽然提出的变化确实如此,但它也做了其他事情。

其中一件事是用TextBlock代替默认的实现,我相信一个ContentPresenter。 那么当我们稍后添加第二个扩展器到这个stackpanel会发生什么呢? 也许是这样的:

 <Expander> <Expander.Header> <StackPanel> <Border height="5" width="5" Foreground="Blue"/> <TextBlock>Ha!</TextBlock> </StackPanel> </Expander.Header> </Expander> 

我不知道,但不好。 相反,我想我们想保持这个简单。

 <DataTemplate x:Key="expanderHeader"> <ContentPresenter Content={Binding} TextBlock.Background={StaticResource myBrush}/> </DataTemplate> <Style TargetType="Expander"> <Setter Property="HeaderTemplate" Value="{StaticResource expanderHeader}"/> </Style> 

这样,当有人在我们的扩展器中放入不仅仅是文本的东西时,我们不会中断。 如果你想确保你用这个背景来完成他们所做的全部工作,这可能是期望的,那看起来像:

 <DataTemplate x:Key="expanderHeader"> <Border Background={StaticResource myBrush}> <ContentPresenter Content={Binding}/> </Border> </DataTemplate> 

取决于你想要的风格 – 你可以devise它的任何部分。 如果您想要更改标题中的内容,只需将所有的UI放在Expander.Header属性中,它就会显示在标题区域中。

如果这不符合你的需求,你可能需要重新模板控制。 看看WPF中的控件模板