【问题标题】:Setting different content based on property value根据属性值设置不同的内容
【发布时间】:2012-09-06 19:24:38
【问题描述】:

我有点不知道该采取什么策略。我需要执行以下操作:

我有一个切换按钮作为基类。这个按钮具有普通按钮的所有属性,加上 IsChecked,它告诉我们按钮是否被切换。

我想为 ToggleButton 创建一个样式(或模板)。基本上它必须继承ToggleButton的原始样式,并添加:

IsChecked=True:将 ToolTip 设置为“折叠”并显示此内容(减号)

<Path Margin="2" Stroke="ForeGround property on control" Data="M0,5 H10" StrokeThickness="3" />

IsChecked=False,设置 ToolTip tp “展开”并显示此内容(加号)

<Path Margin="2" Stroke="ForeGround property on control" Data="M0,5 H10 M5,0 V10" StrokeThickness="3" />

我尝试了几种方法,但总是遇到一些我无法解决的异常。

另一种方法是只包含一个内容(加号),但分为两行:

<Grid>
    <Path Margin="2" Stroke="ForeGround property on control" Data="M0,5 H10" StrokeThickness="3" />
    <Path x:Name="verticalLine" Margin="2" Stroke="ForeGround property on control" Data="M5,0 V10" StrokeThickness="3" />
</Grid>

并且他们根据展开/折叠状态悬挂垂直线的可见性。

我取得了一些进展:

<Style x:Key="myToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource ToggleButtonStyle}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <Grid>
                <Path Margin="2" Stroke="Black" Data="M0,5 H10" StrokeThickness="3" />
                <Path x:Name="verticalLine" Margin="2" Stroke="Black" Data="M5,0 V10"  StrokeThickness="3" />
            </Grid>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.Target="verticalLine" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Collapsed</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.Target="verticalLine" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Visible</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>

我现在唯一不能做的就是将 Stroke 设置为 ToggleButton 的前景色。我已经尝试了所有我记得的东西,从 TemplatedParent 到 AncestorType,但没有成功。

【问题讨论】:

    标签: wpf xaml wpf-controls


    【解决方案1】:

    好的,这是最终的解决方案:

    <Style x:Key="MyToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource ToggleButtonStyle}}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid>
                        <Path Margin="4" Data="M0,5 H10" Stretch="UniformToFill" Stroke="{TemplateBinding Control.Foreground}" StrokeThickness="3" />
                        <Path x:Name="verticalLine" Margin="4" Data="M5,0 V10" Stretch="UniformToFill" Stroke="{TemplateBinding Control.Foreground}" StrokeThickness="3" />
                    </Grid>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="verticalLine" Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Collapsed</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="verticalLine" Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    【讨论】:

      【解决方案2】:

      尝试根据ToggleButtons IsChecked属性更改Path.Data

                        <ToggleButton.Style>
                              <Style TargetType="ToggleButton">
                                  <Setter Property="ToolTip" Value="Collapsed"/>
                                  <Setter Property="Content">
                                      <Setter.Value>
                                          <Path Margin="2" Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=ToggleButton}}" StrokeThickness="3">
                                              <Path.Style>
                                                  <Style TargetType="Path">
                                                      <Setter Property="Data" Value="M0,5 H10 M5,0 V10 "/>
                                                      <Style.Triggers>
                                                          <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton}, Path=IsChecked}" Value="True">
                                                              <Setter Property="Data" Value="M0,5 H10"/>
                                                          </DataTrigger>
                                                      </Style.Triggers>
                                                  </Style>
                                              </Path.Style>
                                          </Path>
                                      </Setter.Value>
                                  </Setter>
                                  <Style.Triggers>
                                      <Trigger Property="IsChecked" Value="True">
                                          <Setter Property="ToolTip" Value="Expanded"/>
                                      </Trigger>
                                  </Style.Triggers>
                              </Style>
                          </ToggleButton.Style>
      

      【讨论】:

      • 嗨 Miklos,我无法将 Content 设置为样式,我需要将此样式作为资源,可用于许多控件实例。
      猜你喜欢
      • 2014-05-30
      • 2022-11-22
      • 2022-09-23
      • 2011-11-27
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多