自定义wpf扩展器控件 [英] Customizing wpf expander control

查看:81
本文介绍了自定义wpf扩展器控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在wpf中更改扩展器的ToggleButton箭头.... 完整的控件模板代码是:



  

< SolidColorBrush x:Key =" Expander.MouseOver.Circle.Stroke"颜色="#FFFFFFFF" /> 
< SolidColorBrush x:Key =" Expander.MouseOver.Circle.Fill"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.MouseOver.Arrow.Stroke"颜色="#FF0583CB" />
< SolidColorBrush x:Key =" Expander.Pressed.Circle.Stroke"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Pressed.Circle.Fill"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Pressed.Arrow.Stroke"颜色="#FF0583CB" />
< SolidColorBrush x:Key =" Expander.Disabled.Circle.Stroke"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Disabled.Circle.Fill"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Disabled.Arrow.Stroke"颜色="#FF0583CB" />
< SolidColorBrush x:Key =" Expander.Static.Circle.Fill"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Static.Circle.Stroke"颜色="#FFFFFFFF" />
< SolidColorBrush x:Key =" Expander.Static.Arrow.Stroke"颜色="#FF0583CB" />
< Style x:Key =" ExpanderRightHeaderStyle" TargetType =" {x:Type ToggleButton}">
< Setter Property =" Template">
< Setter.Value>
< ControlTemplate TargetType =" {x:Type ToggleButton}">
< Border Padding =" {TemplateBinding Padding}">
<网格背景="透明" SnapsToDevicePixels = QUOT假QUOT;>
< Grid.RowDefinitions>
< RowDefinition Height =" 19" />
< RowDefinition Height =" *" />
< /Grid.RowDefinitions>
< Grid>
< Grid.LayoutTransform>
< TransformGroup>
< TransformGroup.Children>
< TransformCollection>
< RotateTransform Angle =" -90" />
< / TransformCollection>
< /TransformGroup.Children>
< / TransformGroup>
< /Grid.LayoutTransform>
< Ellipse x:Name =" circle" Fill =" {StaticResource Expander.Static.Circle.Fill}"的Horizo​​ntalAlignment = QUOT;中心"高度= QUOT 19 QUOT; Stroke =" {StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment = QUOT;中心"宽度= QUOT 19 QUOT; />
<路径x:名称="箭头"数据="M 1,1.5 L 1.5,5 L 8,1.5"的Horizo​​ntalAlignment = QUOT;中心" SnapsToDevicePixels = QUOT假QUOT; Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸VerticalAlignment = QUOT;中心" />
< / Grid>
< ContentPresenter Horizo​​ntalAlignment =" Center"余量= QUOT; 0,4,0,0" Grid.Row = QUOT 1 QUOT; RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;顶部和QUOT; />
< / Grid>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M 1,4.5 L 4.5,1 L 8,4.5"/>
< / Trigger>
< Trigger Property =" IsMouseOver"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.MouseOver.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsPressed"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Stroke}" />
< Setter Property =" StrokeThickness"的TargetName = QUOT;圆"值= QUOT; 1.5" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Pressed.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsEnabled"值= QUOT假QUOT;>
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Disabled.Arrow.Stroke}" />
< / Trigger>
< /ControlTemplate.Triggers>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>
< Style x:Key =" ExpanderUpHeaderStyle" TargetType =" {x:Type ToggleButton}">
< Setter Property =" Template">
< Setter.Value>
< ControlTemplate TargetType =" {x:Type ToggleButton}">
< Border Padding =" {TemplateBinding Padding}">
<网格背景="透明" SnapsToDevicePixels = QUOT假QUOT;>
< Grid.ColumnDefinitions>
< ColumnDefinition Width =" 19" />
< ColumnDefinition Width =" *" />
< /Grid.ColumnDefinitions>
< Grid>
< Grid.LayoutTransform>
< TransformGroup>
< TransformGroup.Children>
< TransformCollection>
< RotateTransform Angle =" 180" />
< / TransformCollection>
< /TransformGroup.Children>
< / TransformGroup>
< /Grid.LayoutTransform>
< Ellipse x:Name =" circle" Fill =" {StaticResource Expander.Static.Circle.Fill}"的Horizo​​ntalAlignment = QUOT;中心"高度= QUOT 19 QUOT; Stroke =" {StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment = QUOT;中心"宽度= QUOT 19 QUOT; />
<路径x:名称="箭头"数据="M 1,1.5 L 4.5,5 L 8,4.5"的Horizo​​ntalAlignment = QUOT;中心" SnapsToDevicePixels = QUOT假QUOT; Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸VerticalAlignment = QUOT;中心" />
< / Grid>
< ContentPresenter Grid.Column =" 1"的Horizo​​ntalAlignment = QUOT;左"余量= QUOT; 4,0,0,0" RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;中心" />
< / Grid>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M 1,4.5 L 4.5,1 L 8,4.5"/>
< / Trigger>
< Trigger Property =" IsMouseOver"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.MouseOver.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsPressed"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Stroke}" />
< Setter Property =" StrokeThickness"的TargetName = QUOT;圆"值= QUOT; 1.5" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Pressed.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsEnabled"值= QUOT假QUOT;>
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Disabled.Arrow.Stroke}" />
< / Trigger>
< /ControlTemplate.Triggers>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>
< Style x:Key =" ExpanderLeftHeaderStyle" TargetType =" {x:Type ToggleButton}">
< Setter Property =" Template">
< Setter.Value>
< ControlTemplate TargetType =" {x:Type ToggleButton}">
< Border Padding =" {TemplateBinding Padding}">
<网格背景="透明" SnapsToDevicePixels = QUOT假QUOT;>
< Grid.RowDefinitions>
< RowDefinition Height =" 19" />
< RowDefinition Height =" *" />
< /Grid.RowDefinitions>
< Grid>
< Grid.LayoutTransform>
< TransformGroup>
< TransformGroup.Children>
< TransformCollection>
< RotateTransform Angle =" 90" />
< / TransformCollection>
< /TransformGroup.Children>
< / TransformGroup>
< /Grid.LayoutTransform>
< Ellipse x:Name =" circle" Fill =" {StaticResource Expander.Static.Circle.Fill}"的Horizo​​ntalAlignment = QUOT;中心"高度= QUOT 19 QUOT; Stroke =" {StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment = QUOT;中心"宽度= QUOT 19 QUOT; />
<路径x:名称="箭头"数据="M 13,4.5 L 4.5,5 L 8,4.5"的Horizo​​ntalAlignment = QUOT;中心" SnapsToDevicePixels = QUOT假QUOT; Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸VerticalAlignment = QUOT;中心" />
< / Grid>
< ContentPresenter Horizo​​ntalAlignment =" Center"余量= QUOT; 0,4,0,0" Grid.Row = QUOT 1 QUOT; RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;顶部和QUOT; />
< / Grid>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M 1,4.5 L 4.5,1 L 8,4.5"/>
< / Trigger>
< Trigger Property =" IsMouseOver"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.MouseOver.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsPressed"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Stroke}" />
< Setter Property =" StrokeThickness"的TargetName = QUOT;圆"值= QUOT; 1.5" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Pressed.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsEnabled"值= QUOT假QUOT;>
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Disabled.Arrow.Stroke}" />
< / Trigger>
< /ControlTemplate.Triggers>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>
< Style x:Key =" ExpanderHeaderFocusVisual">
< Setter Property =" Control.Template">
< Setter.Value>
< ControlTemplate>
< Border>
< Rectangle Margin =" 0" SnapsToDevicePixels = QUOT;真"行程="黑色" StrokeThickness = QUOT 1 QUOT; StrokeDashArray =" 1 2" />
< / Border>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>
< Style x:Key =" ExpanderDownHeaderStyle" TargetType =" {x:Type ToggleButton}">
< Setter Property =" Template">
< Setter.Value>
< ControlTemplate TargetType =" {x:Type ToggleButton}">
< Border Padding =" {TemplateBinding Padding}">
<网格背景="透明" SnapsToDevicePixels = QUOT假QUOT;>
< Grid.ColumnDefinitions>
< ColumnDefinition Width =" 19" />
< ColumnDefinition Width =" *" />
< /Grid.ColumnDefinitions>
< Ellipse x:Name =" circle"的Horizo​​ntalAlignment = QUOT;中心"高度= QUOT 19 QUOT; Stroke =" {StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment = QUOT;中心"宽度= QUOT 19 QUOT;>
< / Ellipse>
<路径x:名称="箭头"数据="M 8 9 12 12 8 15"的Horizo​​ntalAlignment = QUOT;中心" SnapsToDevicePixels = QUOT假QUOT; Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸VerticalAlignment = QUOT;中心" >
< / Path>
< ContentPresenter Grid.Column =" 1"的Horizo​​ntalAlignment = QUOT;左"余量= QUOT; 4,0,0,0" RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;中心" />
< / Grid>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>

< Setter Property =" Margin"的TargetName = QUOT;箭头"值= QUOT; 5,4,-4.8,-2.8" />
< / Trigger>
< Trigger Property =" IsMouseOver"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.MouseOver.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.MouseOver.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsPressed"值= QUOT;真">
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Stroke}" />
< Setter Property =" StrokeThickness"的TargetName = QUOT;圆"值= QUOT; 1.5" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Pressed.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Pressed.Arrow.Stroke}" />
< / Trigger>
< Trigger Property =" IsEnabled"值= QUOT假QUOT;>
< Setter Property =" Stroke"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Stroke}" />
< Setter Property =" Fill"的TargetName = QUOT;圆" Value =" {StaticResource Expander.Disabled.Circle.Fill}" />
< Setter Property =" Stroke"的TargetName = QUOT;箭头" Value =" {StaticResource Expander.Disabled.Arrow.Stroke}" />
< / Trigger>
< /ControlTemplate.Triggers>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>
< Style x:Key =" ExpanderStyle1" TargetType =" {x:Type Expander}">
< Setter Property =" Foreground" Value =" {DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
< Setter Property =" Background"值= QUOT;透明" />
< Setter Property =" Horizo​​ntalContentAlignment"值= QUOT;拉伸" />
< Setter Property =" VerticalContentAlignment"值= QUOT;拉伸" />
< Setter Property =" BorderBrush"值= QUOT;透明" />
< Setter Property =" BorderThickness"值= QUOT 1 QUOT; />
< Setter Property =" Template">
< Setter.Value>
< ControlTemplate TargetType =" {x:Type Expander}">
< Border BorderBrush =" {TemplateBinding BorderBrush}" BorderThickness =" {TemplateBinding BorderThickness}" Background =" {TemplateBinding Background}" CornerRadius = QUOT; 3英寸SnapsToDevicePixels = QUOT;真">
< DockPanel>
< ToggleButton x:Name =" HeaderSite" ContentTemplate =" {TemplateBinding HeaderTemplate}" ContentTemplateSelector =" {TemplateBinding HeaderTemplateSelector}" Content =" {TemplateBinding Header}" DockPanel.Dock = QUOT;陀螺" Foreground =" {TemplateBinding Foreground}" FontWeight =" {TemplateBinding FontWeight}" FocusVisualStyle =" {StaticResource ExpanderHeaderFocusVisual}" FontStyle =" {TemplateBinding FontStyle}" FontStretch =" {TemplateBinding FontStretch}" FontSize =" {TemplateBinding FontSize}" FontFamily =" {TemplateBinding FontFamily}" Horizo​​ntalContentAlignment =" {TemplateBinding Horizo​​ntalContentAlignment}" IsChecked =" {Binding IsExpanded,Mode = TwoWay,RelativeSource = {RelativeSource TemplatedParent}}"余量= QUOT 1 QUOT; MinWidth = QUOT; 0"了minHeight = QUOT; 0" Padding =" {TemplateBinding Padding}" Style =" {StaticResource ExpanderDownHeaderStyle}" VerticalContentAlignment =" {TemplateBinding VerticalContentAlignment}" />
< ContentPresenter x:Name =" ExpandSite" DockPanel.Dock = QUOT;底座"可聚焦= QUOT假QUOT; Horizo​​ntalAlignment =" {TemplateBinding Horizo​​ntalContentAlignment}" Margin =" {TemplateBinding Padding}"能见度= QUOT;折叠" VerticalAlignment =" {TemplateBinding VerticalContentAlignment}" />
< / DockPanel>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsExpanded"值= QUOT;真">
< Setter Property =" Visibility"的TargetName = QUOT; ExpandSite"值= QUOT;可见" />
< / Trigger>
< Trigger Property =" ExpandDirection"值= QUOT;右">
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; ExpandSite"值= QUOT;右" />
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; HeaderSite"值= QUOT;左" />
< Setter Property =" Style"的TargetName = QUOT; HeaderSite" Value =" {StaticResource ExpanderRightHeaderStyle}" />
< / Trigger>
< Trigger Property =" ExpandDirection"值= QUOT;多达">
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; ExpandSite"值= QUOT;顶部和QUOT; />
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; HeaderSite"值= QUOT;底座" />
< Setter Property =" Style"的TargetName = QUOT; HeaderSite" Value =" {StaticResource ExpanderUpHeaderStyle}" />
< / Trigger>
< Trigger Property =" ExpandDirection"值= QUOT;左">
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; ExpandSite"值= QUOT;左" />
< Setter Property =" DockPanel.Dock"的TargetName = QUOT; HeaderSite"值= QUOT;右" />
< Setter Property =" Style"的TargetName = QUOT; HeaderSite" Value =" {StaticResource ExpanderLeftHeaderStyle}" />
< / Trigger>
< Trigger Property =" IsEnabled"值= QUOT假QUOT;>
< Setter Property =" Foreground" Value =" {DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
< / Trigger>
< /ControlTemplate.Triggers>
< / ControlTemplate>
< /Setter.Value>
< / Setter>
< / Style>


我的问题在这里:

(第1部分 - 右箭头)

<路径x:名称="箭头"数据="M 8 9 12 12 8 15"的Horizo​​ntalAlignment = QUOT;中心" SnapsToDevicePixels = QUOT假QUOT; Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸VerticalAlignment = QUOT;中心" >
< / Path>
< ContentPresenter Grid.Column =" 1"的Horizo​​ntalAlignment = QUOT;左"余量= QUOT; 4,0,0,0" RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;中心" />
< / Grid>
< / Border>
(第2部分 - 向下箭头)
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>

< Setter Property =" Margin"的TargetName = QUOT;箭头"值= QUOT; 5,4,-4.8,-2.8" />
< / Trigger>

第2部分 - 向下箭头中的代码完美无缺。但在第1部分中,我试图制作一个正确的箭头。第1部分中的路径点产生右箭头但是它与第2部分中的箭头大小不同。此外,第1部分的代码更改了右边的
箭头位置,它没有坚持第2部分中向下箭头的位置


图像1:drive.google。 com / open?id = 1d4uGK8c1ixqOEHzbUc9m2OKb6XWflnMa


image 2:drive.google.com/open?id=1hpIFIzKfg9LAroj4WJ_LvbJKWe33lTYf


image 3:drive.google。 com / open?id = 1Ic02TEA4adAQmtNB9Nd7-8tlGh4t_K4s



解决方案

< blockquote>

给你的路径一个大小,使用stretch = fill并失去触发器的边距:

< Path x:Name =" arrow" 
拉伸="填充"
数据="M 8 9 12 12 8 15"
高度=" 8"
Width =" 8"

Horizo​​ntalAlignment =" Center"
VerticalAlignment =" Center"
SnapsToDevicePixels =" false"
Stroke =" {StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness = QUOT; 2英寸
> < /路径>
< ContentPresenter Grid.Column =" 1"的Horizo​​ntalAlignment = QUOT;左"余量= QUOT; 4,0,0,0" RecognizesAccessKey = QUOT;真" SnapsToDevicePixels = QUOT;真" VerticalAlignment = QUOT;中心" />
< / Grid>
< / Border>
< ControlTemplate.Triggers>
< Trigger Property =" IsChecked"值= QUOT;真">
< Setter Property =" Data"的TargetName = QUOT;箭头"值="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>
< / Trigger>


I am trying to change the ToggleButton arrow of the expander in wpf.... The full control template code is :

  

 <SolidColorBrush x:Key="Expander.MouseOver.Circle.Stroke" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.MouseOver.Circle.Fill" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.MouseOver.Arrow.Stroke" Color="#FF0583CB"/>
        <SolidColorBrush x:Key="Expander.Pressed.Circle.Stroke" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Pressed.Circle.Fill" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Pressed.Arrow.Stroke" Color="#FF0583CB"/>
        <SolidColorBrush x:Key="Expander.Disabled.Circle.Stroke" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Disabled.Circle.Fill" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Disabled.Arrow.Stroke" Color="#FF0583CB"/>
        <SolidColorBrush x:Key="Expander.Static.Circle.Fill" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Static.Circle.Stroke" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="Expander.Static.Arrow.Stroke" Color="#FF0583CB"/>
        <Style x:Key="ExpanderRightHeaderStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Padding="{TemplateBinding Padding}">
                            <Grid Background="Transparent" SnapsToDevicePixels="False">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="19"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid>
                                    <Grid.LayoutTransform>
                                        <TransformGroup>
                                            <TransformGroup.Children>
                                                <TransformCollection>
                                                    <RotateTransform Angle="-90"/>
                                                </TransformCollection>
                                            </TransformGroup.Children>
                                        </TransformGroup>
                                    </Grid.LayoutTransform>
                                    <Ellipse x:Name="circle" Fill="{StaticResource Expander.Static.Circle.Fill}" HorizontalAlignment="Center" Height="19" Stroke="{StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment="Center" Width="19"/>
                                    <Path x:Name="arrow" Data="M 1,1.5 L 1.5,5 L 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="false" Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" VerticalAlignment="Center"/>
                                </Grid>
                                <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.MouseOver.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Stroke}"/>
                                <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Pressed.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Disabled.Arrow.Stroke}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ExpanderUpHeaderStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Padding="{TemplateBinding Padding}">
                            <Grid Background="Transparent" SnapsToDevicePixels="False">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="19"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Grid>
                                    <Grid.LayoutTransform>
                                        <TransformGroup>
                                            <TransformGroup.Children>
                                                <TransformCollection>
                                                    <RotateTransform Angle="180"/>
                                                </TransformCollection>
                                            </TransformGroup.Children>
                                        </TransformGroup>
                                    </Grid.LayoutTransform>
                                    <Ellipse x:Name="circle" Fill="{StaticResource Expander.Static.Circle.Fill}" HorizontalAlignment="Center" Height="19" Stroke="{StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment="Center" Width="19"/>
                                    <Path x:Name="arrow" Data="M 1,1.5 L 4.5,5 L 8,4.5" HorizontalAlignment="Center" SnapsToDevicePixels="false" Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" VerticalAlignment="Center"/>
                                </Grid>
                                <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.MouseOver.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Stroke}"/>
                                <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Pressed.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Disabled.Arrow.Stroke}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ExpanderLeftHeaderStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Padding="{TemplateBinding Padding}">
                            <Grid Background="Transparent" SnapsToDevicePixels="False">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="19"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid>
                                    <Grid.LayoutTransform>
                                        <TransformGroup>
                                            <TransformGroup.Children>
                                                <TransformCollection>
                                                    <RotateTransform Angle="90"/>
                                                </TransformCollection>
                                            </TransformGroup.Children>
                                        </TransformGroup>
                                    </Grid.LayoutTransform>
                                    <Ellipse x:Name="circle" Fill="{StaticResource Expander.Static.Circle.Fill}" HorizontalAlignment="Center" Height="19" Stroke="{StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment="Center" Width="19"/>
                                    <Path x:Name="arrow" Data="M 13,4.5 L 4.5,5 L 8,4.5" HorizontalAlignment="Center" SnapsToDevicePixels="false" Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" VerticalAlignment="Center"/>
                                </Grid>
                                <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow" Value="M 1,4.5  L 4.5,1  L 8,4.5"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.MouseOver.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Stroke}"/>
                                <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Pressed.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Disabled.Arrow.Stroke}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ExpanderHeaderFocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border>
                            <Rectangle Margin="0" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ExpanderDownHeaderStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Padding="{TemplateBinding Padding}">
                            <Grid Background="Transparent" SnapsToDevicePixels="False">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="19"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Ellipse x:Name="circle"  HorizontalAlignment="Center" Height="19" Stroke="{StaticResource Expander.Static.Circle.Stroke}" VerticalAlignment="Center" Width="19">
                                </Ellipse>
                                <Path  x:Name="arrow"  Data="M 8 9 12 12 8 15"   HorizontalAlignment="Center" SnapsToDevicePixels="false" Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" VerticalAlignment="Center" >
                                </Path>
                                <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow"  Value="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>

                                <Setter Property="Margin" TargetName="arrow" Value="5,4,-4.8,-2.8"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.MouseOver.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.MouseOver.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Stroke}"/>
                                <Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Pressed.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Pressed.Arrow.Stroke}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Stroke" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Stroke}"/>
                                <Setter Property="Fill" TargetName="circle" Value="{StaticResource Expander.Disabled.Circle.Fill}"/>
                                <Setter Property="Stroke" TargetName="arrow" Value="{StaticResource Expander.Disabled.Arrow.Stroke}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ExpanderStyle1" TargetType="{x:Type Expander}">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Expander}">
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="true">
                            <DockPanel>
                                <ToggleButton x:Name="HeaderSite" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" Content="{TemplateBinding Header}" DockPanel.Dock="Top" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" MinWidth="0" MinHeight="0" Padding="{TemplateBinding Padding}" Style="{StaticResource ExpanderDownHeaderStyle}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                <ContentPresenter x:Name="ExpandSite" DockPanel.Dock="Bottom" Focusable="false" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </DockPanel>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsExpanded" Value="true">
                                <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
                            </Trigger>
                            <Trigger Property="ExpandDirection" Value="Right">
                                <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/>
                                <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/>
                                <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderRightHeaderStyle}"/>
                            </Trigger>
                            <Trigger Property="ExpandDirection" Value="Up">
                                <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/>
                                <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/>
                                <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderUpHeaderStyle}"/>
                            </Trigger>
                            <Trigger Property="ExpandDirection" Value="Left">
                                <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/>
                                <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Right"/>
                                <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderLeftHeaderStyle}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

My problem is here :

(part 1-right facing arrow)       

<Path  x:Name="arrow"  Data="M 8 9 12 12 8 15"   HorizontalAlignment="Center" SnapsToDevicePixels="false" Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" VerticalAlignment="Center" >
                                </Path>
                                <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                            </Grid>
                        </Border>
(part 2-down facing arrow)
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow"  Value="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>

                                <Setter Property="Margin" TargetName="arrow" Value="5,4,-4.8,-2.8"/>
                            </Trigger>

The code in part 2-down facing arrow works perfect . But in part-1 , i'm trying to make a right facing arrow.The path points in part 1 makes a right arrow however it's not the same size of the arrow in part 2 . Moreover,the code of part 1 changes the right arrow position,it doesn't stick to the position of the down arrow in part 2

image 1 : drive.google.com/open?id=1d4uGK8c1ixqOEHzbUc9m2OKb6XWflnMa

image 2 : drive.google.com/open?id=1hpIFIzKfg9LAroj4WJ_LvbJKWe33lTYf

image 3 : drive.google.com/open?id=1Ic02TEA4adAQmtNB9Nd7-8tlGh4t_K4s

解决方案

Give your path a size, use stretch=fill and lose the margin on the trigger:

                                <Path  x:Name="arrow" 
                                       Stretch="Fill"
                                       Data="M 8 9 12 12 8 15"  
                                       Height="8"
                                       Width="8"
                                       HorizontalAlignment="Center" 
                                       VerticalAlignment="Center" 
                                       SnapsToDevicePixels="false" 
                                       Stroke="{StaticResource Expander.Static.Arrow.Stroke}" StrokeThickness="2" 
>                                </Path>
                                <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Data" TargetName="arrow"  Value="M -1,-4.5 L -4.5,-1 L -8,-4.5"/>
                            </Trigger>


这篇关于自定义wpf扩展器控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆