我正在尝试在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当前是否可见的按钮?好像你需要打开背后的代码才能实现这一点......我错了吗?
答案 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也会更容易。