如何设置WPF扩展头的样式?
我想在WPF扩展头上应用一个样式。在下面的XAML中,我有一个扩展器,但它的样式适用于所有内容,而不仅仅适用于标题 谢谢如何设置WPF扩展头的样式?,wpf,header,styles,expander,Wpf,Header,Styles,Expander,我想在WPF扩展头上应用一个样式。在下面的XAML中,我有一个扩展器,但它的样式适用于所有内容,而不仅仅适用于标题 谢谢 <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="640" > <StackPanel> <StackPa
<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>
自行车
汽车
卡车
取决于您想要设置的样式——您可以设置其任何部分的样式。如果您想更改标题中的内容,只需将所有UI放在Expander.header属性中,它就会显示在标题区域中
如果这不能满足您的需要,您可能需要重新设置控件的模板。看看WPF中提供的控件模板我结合了和的一些XAML,并提出了一个解决方案。实际上,控件(至少是标头)必须重新模板化
<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>
这是一个文本框
钮扣
我认为瓦西里的答案是正确的,但它似乎比原始海报所需要的要多得多。最初的问题是改变标题的背景。虽然所呈现的变化确实做到了这一点,但它也做了其他事情
另外一件事是用TextBlock替换默认实现,我相信是ContentPresenter。那么,当我们稍后更改扩展器,使标题更复杂时会发生什么呢?可能是这样的:
<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>
我发现获取扩展器宽度是一个真正的问题,您可以编写代码来实现这一点。它在xamlpad中完美地工作。然而,在我的代码中,它并没有,并导致可怕的图形延迟。Width=“{Binding RelativeSource{RelativeSource Mode=FindAncestor,AncestorType={x:Type Expander},Path=ActualWidth}”>通过添加上面的参数,它可以工作,但会滞后。如果我移除它,或者改变Path=Width,它就不起作用,滞后也就消失了。这正是我所需要的。谢谢有时深入研究XAML是一件令人头痛的事情。我建议删除样式并直接在扩展器上使用“HeaderTemplate”属性。这允许保留默认样式。此样式在datagrid分组头上看起来不错,但需要大量资源。使用此样式后,单击datagrid行和选中该行的时刻后,我会得到1秒的延迟。没有这种风格,一切都很快。我的数据网格中只有300行。