您好我一直在尝试覆盖WPF中的Expander
控件,以使用位于标题“下方”的分隔线。
我找到了一个如何让Expander
看起来像一个分组框的示例,但我不希望边框一直出现,只在边框的顶部。
我遇到的问题是边框使用不透明蒙版来处理标题下面的边框,但是当我将边框粗细设置为0,1,0,0时,不透明蒙版似乎失败了。将任何其他边界设置为1+似乎让它再次起作用(1,1,0,0)但我很困惑为什么这应该有任何区别,如果有任何其他方法来实现所需的结果。
我现有的XAML如下
<ControlTemplate TargetType="{x:Type Expander}">
<Grid SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="6" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="6" />
</Grid.RowDefinitions>
<Border CornerRadius="4" Grid.Row="1" Grid.RowSpan="3" Grid.Column="0" Grid.ColumnSpan="4" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="Transparent" Background="{TemplateBinding Background}" />
<Border x:Name="Header" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Padding="3,0,3,0">
<Grid SnapsToDevicePixels="False" Background="Transparent" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0" MinHeight="0" MinWidth="0"
Name="HeaderToggle"
IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" >
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid SnapsToDevicePixels="False" Background="Transparent">
<Ellipse HorizontalAlignment="Center" x:Name="circle" VerticalAlignment="Center" Width="15" Height="15" Fill="{DynamicResource ButtonNormalBackgroundFill}" Stroke="DarkGray"/>
<Ellipse Visibility="Hidden" HorizontalAlignment="Center" x:Name="shadow" VerticalAlignment="Center" Width="13" Height="13" Fill="{DynamicResource ExpanderShadowFill}"/>
<Path SnapsToDevicePixels="false" x:Name="arrow" VerticalAlignment="Center" HorizontalAlignment="Center" Stroke="#666" StrokeThickness="2" Data="M1,1 L4,4 7,1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Data" TargetName="arrow" Value="M 1,4 L 4,1 L 7,4"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Stroke" TargetName="circle" Value="#666"/>
<Setter Property="Stroke" TargetName="arrow" Value="#222"/>
<Setter Property="Visibility" TargetName="shadow" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
<ContentPresenter ContentSource="Header" RecognizesAccessKey="true"
TextElement.Foreground="{StaticResource GroupBoxHeaderBrush}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="3,0,0,0" />
</Grid>
</Border>
<ContentPresenter x:Name="ExpandSite" Visibility="Collapsed" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<Border Grid.Row="1" Grid.ColumnSpan="4" BorderThickness="0,1,0,0" BorderBrush="{TemplateBinding BorderBrush}" >
<Border.OpacityMask>
<MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
<Binding Path="ActualWidth" ElementName="Header"/>
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>
</Border.OpacityMask>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="true">
<Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
编辑:在下面,我的意思是落后于
好的,所以我在照片上购买了一个我想要在视觉上看到的例子,现在又增加了最右边一个按钮的复杂性。
我很高兴创建一个复杂的蒙版来处理其他控件,但我只是不知道如何,我确定我实际上不需要边框,因为只需要一行就可以了。
感谢任何帮助,请记住我希望togglebutton和标题文本的背景为TRANSPARENT,以便复制父控件的背景。
由于
答案 0 :(得分:1)
<强>更新强>
好的,我可以将您的屏幕截图翻译成类似
的内容
的Xaml:
<ControlTemplate TargetType="{x:Type Expander}">
<Grid SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="6" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0"
Grid.Column="0"
Height="1"
Margin="0 4 0 0"
VerticalAlignment="Center"
Fill="{TemplateBinding BorderBrush}" />
<Rectangle Grid.Row="0"
Grid.Column="2"
Grid.ColumnSpan="2"
Height="1"
Margin="0 4 0 0"
VerticalAlignment="Center"
Fill="{TemplateBinding BorderBrush}" />
<Border x:Name="Header"
Grid.Row="0"
Grid.Column="1"
Padding="3,0,3,0">
<Grid Background="Transparent"
SnapsToDevicePixels="False">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToggleButton Name="HeaderToggle"
Grid.Column="0"
MinWidth="0"
MinHeight="0"
IsChecked="{Binding Path=IsExpanded,
Mode=TwoWay,
RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid Background="Transparent"
SnapsToDevicePixels="False">
<Ellipse x:Name="circle"
Width="15"
Height="15"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{DynamicResource ButtonNormalBackgroundFill}"
Stroke="DarkGray" />
<Ellipse x:Name="shadow"
Width="13"
Height="13"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{DynamicResource ExpanderShadowFill}"
Visibility="Hidden" />
<Path x:Name="arrow"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="M1,1 L4,4 7,1"
SnapsToDevicePixels="false"
Stroke="#666"
StrokeThickness="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="true">
<Setter TargetName="arrow"
Property="Data"
Value="M 1,4 L 4,1 L 7,4" />
</Trigger>
<Trigger Property="IsMouseOver"
Value="true">
<Setter TargetName="circle"
Property="Stroke"
Value="#666" />
<Setter TargetName="arrow"
Property="Stroke"
Value="#222" />
<Setter TargetName="shadow"
Property="Visibility"
Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
<ContentPresenter Grid.Column="1"
Margin="3,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
ContentSource="Header"
RecognizesAccessKey="true"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
TextElement.Foreground="Black" />
</Grid>
</Border>
<ContentPresenter x:Name="ExpandSite"
Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="{TemplateBinding Padding}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Visibility="Collapsed" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded"
Value="true">
<Setter TargetName="ExpandSite"
Property="Visibility"
Value="Visible" />
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
我还删除了一些未被使用的Grid
Rows
并删除了一些Grid
附加属性,这些属性是{{1} }。
主要更改几乎删除了Grid
和Border
,只是在适当的OpacityMask
列中以高度1渲染Rectangle
。这样你实际上根本不会在标题后面渲染任何内容。
您可以在向右添加Grid
时扩展此概念。只需将其放入自己的网格列中,不要在该列中呈现Button