单击按钮是否可以仅使用XAML触发器永久更改图像的源?

时间:2010-09-24 00:09:38

标签: wpf xaml

我正在尝试在WPF数据网格上解决以下问题:

我将DataGrid项目模板化为包含一个按钮 - 单击时,它会显示网格的RowDetails。我无法按照我想要的方式设置按钮。具体来说,我希望它显示为“超链接”,旁边有一个小的加号图标。单击以显示RowDetails时,该图标应更改为减号。

这是我试图应用于Button的ControlTemplate:

<ControlTemplate x:Key="linkButtonTemplate" TargetType="{x:Type Button}">
     <StackPanel Orientation="Horizontal">                    
          <Image x:Name="expanderIcon" Source="Images/Plus.png"/>
          <TextBlock Foreground="Blue" TextDecorations="Underline" Padding="5 0 0 0">
               <ContentPresenter />
          </TextBlock>                    
     </StackPanel>
</ControlTemplate>

因此,当单击该按钮时,我想更改该Image的Source属性。当它再次被点击时,我想要改回来。我遇到了以下建议的解决方案,似乎没有理想的选择:

1。 Button.IsPressed事件上的Use a Trigger它有效! ...一旦事件结束,图像将恢复(即一旦IsPressed属性不再为真)。所以它不起作用。

2。使用EventTrigger这些至少可以让你抓住Button的点击事件......和

  

与Trigger不同,EventTrigger没有   终止国家的概念,所以   一旦该行动将不会撤消   引发事件的条件是否定的   更长的时间。

太棒了!但它们似乎只让你回应Storyboard动作,而不是简单的属性Setter。除非我遗漏了某些内容,否则这些不适合这种情况。

第3。使用Attached Behavior我正在深入研究这个选项,但我不禁想到应该是一个XAML包含的方法。如果没有,那就这样吧 - 我将学习附加行为。

但我希望有人对此我有一个角度,我没有遇到过。

例如,有没有办法挂钩DataRow的属性,该属性包含指示RowDetails当前是否可见的按钮?好像你需要打开背后的代码才能实现这一点......我错了吗?

2 个答案:

答案 0 :(得分:3)

我不会声称EventTriggers不适用于此,单帧动画很好,甚至可以在某些控件的默认模板中找到,例如。

<VisualState Name="CalendarButtonFocused">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CalendarButtonFocusVisual" Storyboard.TargetProperty="Visibility" Duration="0">
            <DiscreteObjectKeyFrame KeyTime="0">
                <DiscreteObjectKeyFrame.Value>
                    <Visibility>Visible</Visibility>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>

以下是如何以这种方式更改Source的示例:

<Image Name="img" Source="C:\Users\Public\1.png"/>
<Button Content="!">
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference img}"
                                                       Storyboard.TargetProperty="Source">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                <DiscreteObjectKeyFrame.Value>
                                    <BitmapImage UriSource="C:\Users\Public\2.png"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Button.Triggers>
</Button>

答案 1 :(得分:1)

您可以使用重新设置的ToggleButton来表示这样的场景,并将图像可见性绑定到IsChecked属性。将RowDetails的可见性绑定到IT也会更容易。