为什么当我设置Expander的模板时它不会展开?

4

我正在尝试更改可展开控件(Expander)的展开按钮颜色,似乎唯一的方法是更改其控件模板,因为没有属性可以设置它。

所以,我使用了Show Me The Template来获取Aero主题的模板。然后,我将该模板应用于我的可展开控件,没有进行其他更改。它看起来很好,但单击按钮不再导致它展开。

有人能解释一下这是为什么吗?我认为这是一个简单的问题,但我还在学习WPF,无法解决它。谢谢。

以下是完整的代码:

<Expander Header="Test">
  <Expander.Template>
    <ControlTemplate TargetType="Expander" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Border BorderThickness="{TemplateBinding Border.BorderThickness}" CornerRadius="3,3,3,3" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True">
        <DockPanel>
          <ToggleButton IsChecked="False" Content="{TemplateBinding HeaderedContentControl.Header}" ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" Foreground="{TemplateBinding TextElement.Foreground}" FontFamily="{TemplateBinding TextElement.FontFamily}" FontSize="{TemplateBinding TextElement.FontSize}" FontStretch="{TemplateBinding TextElement.FontStretch}" FontStyle="{TemplateBinding TextElement.FontStyle}" FontWeight="{TemplateBinding TextElement.FontWeight}" HorizontalContentAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding Control.VerticalContentAlignment}" Padding="{TemplateBinding Control.Padding}" Name="HeaderSite" MinWidth="0" MinHeight="0" Margin="1,1,1,1" DockPanel.Dock="Top">
            <ToggleButton.Style>
              <Style TargetType="ToggleButton">
                <Style.Resources>
                  <ResourceDictionary />
                </Style.Resources>
                <Setter Property="Control.Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                      <Border Padding="{TemplateBinding Control.Padding}">
                        <Grid Background="#00FFFFFF" SnapsToDevicePixels="False">
                          <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="19" />
                            <ColumnDefinition Width="*" />
                          </Grid.ColumnDefinitions>
                          <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" />
                          <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" />
                          <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" SnapsToDevicePixels="True" Grid.Column="1" />
                        </Grid>
                      </Border>
                      <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked">
                          <Setter TargetName="arrow" Property="Path.Data">
                            <Setter.Value>
                              <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="UIElement.IsMouseOver">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF3C7FB1</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF222222</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="ButtonBase.IsPressed">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF526C7B</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="circle" Property="Shape.StrokeThickness">
                            <Setter.Value>
                              <s:Double>1.5</s:Double>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF003366</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                      </ControlTemplate.Triggers>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </ToggleButton.Style>
            <ToggleButton.FocusVisualStyle>
              <Style TargetType="IFrameworkInputElement">
                <Style.Resources>
                  <ResourceDictionary />
                </Style.Resources>
                <Setter Property="Control.Template">
                  <Setter.Value>
                    <ControlTemplate>
                      <Border>
                        <Rectangle Stroke="#FF000000" StrokeThickness="1" StrokeDashArray="1 2" Margin="0,0,0,0" SnapsToDevicePixels="True" />
                      </Border>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </ToggleButton.FocusVisualStyle>
          </ToggleButton>
          <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Name="ExpandSite" Margin="{TemplateBinding Control.Padding}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" Visibility="Collapsed" Focusable="False" DockPanel.Dock="Bottom" />
        </DockPanel>
      </Border>
      <ControlTemplate.Triggers>
        <Trigger Property="Expander.IsExpanded">
          <Setter TargetName="ExpandSite" Property="UIElement.Visibility" Value="{x:Static Visibility.Visible}" />
          <Trigger.Value>
            <s:Boolean>True</s:Boolean>
          </Trigger.Value>
        </Trigger>
        <Trigger Property="Expander.ExpandDirection">
          <Setter TargetName="ExpandSite" Property="DockPanel.Dock" Value="{x:Static Dock.Right}" />
          <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="{x:Static Dock.Left}" />
          <Setter TargetName="HeaderSite" Property="FrameworkElement.Style">
            <Setter.Value>
              <Style TargetType="ToggleButton">
                <Style.Resources>
                  <ResourceDictionary />
                </Style.Resources>
                <Setter Property="Control.Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                      <Border Padding="{TemplateBinding Control.Padding}">
                        <Grid Background="#00FFFFFF" SnapsToDevicePixels="False">
                          <Grid.RowDefinitions>
                            <RowDefinition Height="19" />
                            <RowDefinition Height="*" />
                          </Grid.RowDefinitions>
                          <Grid>
                            <Grid.LayoutTransform>
                              <TransformGroup>
                                <TransformGroup.Children>
                                  <RotateTransform Angle="-90" />
                                </TransformGroup.Children>
                              </TransformGroup>
                            </Grid.LayoutTransform>
                            <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" />
                          </Grid>
                          <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="0,4,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" />
                        </Grid>
                      </Border>
                      <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked">
                          <Setter TargetName="arrow" Property="Path.Data">
                            <Setter.Value>
                              <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="UIElement.IsMouseOver">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF3C7FB1</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF222222</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="ButtonBase.IsPressed">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF526C7B</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="circle" Property="Shape.StrokeThickness">
                            <Setter.Value>
                              <s:Double>1.5</s:Double>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF003366</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                      </ControlTemplate.Triggers>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </Setter.Value>
          </Setter>
          <Trigger.Value>
            <x:Static Member="ExpandDirection.Right" />
          </Trigger.Value>
        </Trigger>
        <Trigger Property="Expander.ExpandDirection">
          <Setter TargetName="ExpandSite" Property="DockPanel.Dock" Value="{x:Static Dock.Top}" />
          <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="{x:Static Dock.Bottom}" />
          <Setter TargetName="HeaderSite" Property="FrameworkElement.Style">
            <Setter.Value>
              <Style TargetType="ToggleButton">
                <Style.Resources>
                  <ResourceDictionary />
                </Style.Resources>
                <Setter Property="Control.Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                      <Border Padding="{TemplateBinding Control.Padding}">
                        <Grid Background="#00FFFFFF" SnapsToDevicePixels="False">
                          <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="19" />
                            <ColumnDefinition Width="*" />
                          </Grid.ColumnDefinitions>
                          <Grid>
                            <Grid.LayoutTransform>
                              <TransformGroup>
                                <TransformGroup.Children>
                                  <RotateTransform Angle="180" />
                                </TransformGroup.Children>
                              </TransformGroup>
                            </Grid.LayoutTransform>
                            <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" />
                          </Grid>
                          <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" SnapsToDevicePixels="True" Grid.Column="1" />
                        </Grid>
                      </Border>
                      <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked">
                          <Setter TargetName="arrow" Property="Path.Data">
                            <Setter.Value>
                              <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="UIElement.IsMouseOver">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF3C7FB1</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF222222</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="ButtonBase.IsPressed">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF526C7B</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="circle" Property="Shape.StrokeThickness">
                            <Setter.Value>
                              <s:Double>1.5</s:Double>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF003366</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                      </ControlTemplate.Triggers>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </Setter.Value>
          </Setter>
          <Trigger.Value>
            <x:Static Member="ExpandDirection.Up" />
          </Trigger.Value>
        </Trigger>
        <Trigger Property="Expander.ExpandDirection">
          <Setter TargetName="ExpandSite" Property="DockPanel.Dock" Value="{x:Static Dock.Left}" />
          <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="{x:Static Dock.Right}" />
          <Setter TargetName="HeaderSite" Property="FrameworkElement.Style">
            <Setter.Value>
              <Style TargetType="ToggleButton">
                <Style.Resources>
                  <ResourceDictionary />
                </Style.Resources>
                <Setter Property="Control.Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                      <Border Padding="{TemplateBinding Control.Padding}">
                        <Grid Background="#00FFFFFF" SnapsToDevicePixels="False">
                          <Grid.RowDefinitions>
                            <RowDefinition Height="19" />
                            <RowDefinition Height="*" />
                          </Grid.RowDefinitions>
                          <Grid>
                            <Grid.LayoutTransform>
                              <TransformGroup>
                                <TransformGroup.Children>
                                  <RotateTransform Angle="90" />
                                </TransformGroup.Children>
                              </TransformGroup>
                            </Grid.LayoutTransform>
                            <Ellipse Stroke="#FFA9A9A9" Name="circle" Width="19" Height="19" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            <Path Data="M1,1.5L4.5,5 8,1.5" Stroke="#FF666666" StrokeThickness="2" Name="arrow" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="False" />
                          </Grid>
                          <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="0,4,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" SnapsToDevicePixels="True" Grid.Row="1" />
                        </Grid>
                      </Border>
                      <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked">
                          <Setter TargetName="arrow" Property="Path.Data">
                            <Setter.Value>
                              <StreamGeometry>M1,4.5L4.5,1 8,4.5</StreamGeometry>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="UIElement.IsMouseOver">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF3C7FB1</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF222222</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                        <Trigger Property="ButtonBase.IsPressed">
                          <Setter TargetName="circle" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF526C7B</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="circle" Property="Shape.StrokeThickness">
                            <Setter.Value>
                              <s:Double>1.5</s:Double>
                            </Setter.Value>
                          </Setter>
                          <Setter TargetName="arrow" Property="Shape.Stroke">
                            <Setter.Value>
                              <SolidColorBrush>#FF003366</SolidColorBrush>
                            </Setter.Value>
                          </Setter>
                          <Trigger.Value>
                            <s:Boolean>True</s:Boolean>
                          </Trigger.Value>
                        </Trigger>
                      </ControlTemplate.Triggers>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </Setter.Value>
          </Setter>
          <Trigger.Value>
            <x:Static Member="ExpandDirection.Left" />
          </Trigger.Value>
        </Trigger>
        <Trigger Property="UIElement.IsEnabled">
          <Setter Property="TextElement.Foreground">
            <Setter.Value>
              <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
            </Setter.Value>
          </Setter>
          <Trigger.Value>
            <s:Boolean>False</s:Boolean>
          </Trigger.Value>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Expander.Template>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</Expander>
1个回答

3

当我在Blend中编辑Expander模板的副本时,它应该与你使用ShowMeTheTemplate做的事情大致相同,但名为HeaderSiteToggleButtonIsChecked属性不是False(如上面的XAML中所示),而是这个表达式:

IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 

所以按钮的切换状态与控件的IsExpanded属性绑定。这就是切换按钮生效的方式。

你已经回答了我迄今为止所有问题的帖子!这解决了问题。非常感谢您的时间和帮助。也许我将来应该使用 Blend。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接