Как оформить заголовок расширителя 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>
Решение
Я объединил некоторые XAML из Джош Смит и MSDN и придумал решение.Действительно, элемент управления (по крайней мере, заголовок) должен быть повторно создан.
<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>
Другие советы
Я думаю, что ответ Василе на правильном пути, но, похоже, он делает намного больше, чем требовалось для оригинального плаката.Все, что требовалось сделать в первоначальном вопросе, - это изменить фон заголовка.Хотя представленное изменение действительно делает это, оно также делает и другие вещи.
Одна из этих других вещей заключается в замене реализации по умолчанию, я полагаю, ContentPresenter , на TextBlock .Итак, что произойдет, когда позже мы добавим второй расширитель к этой 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>
Зависит от того, что вы хотите оформить - вы можете оформить любую его часть.Если вы хотите изменить содержимое заголовка, просто поместите весь свой пользовательский интерфейс в расширитель.Свойство Header, и оно отобразится в области заголовка.
если это не соответствует вашим потребностям, вам, вероятно, потребуется повторно создать шаблон элемента управления.Взгляните на шаблоны элементов управления, поставляемые в WPF здесь