我想在单击按钮后更改按钮的 View 。
例如,我有两个模板beforeClicking
和afterClicking
:
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button" x:Name="beforeClicking">
<Border Name="border" Background="Transparent" BorderThickness="1" BorderBrush="Black">
<ContentPresenter/>
</Border>
</ControlTemplate>
<!--It is not permitted, but that is pseudocode(what I want)
<ControlTemplate TargetType="Button" x:Name="afterClicking">
<Border Name="border" Background="Transparent" BorderThickness="10" BorderBrush="Black">
<ContentPresenter/>
</Border>
</ControlTemplate>
-->
</Setter.Value>
</Setter>
</Style>
我想要的是未单击按钮时,则应永久使用模板
beforeClicking
,并且不应更改任何内容(模板或 View )。但是,如果用户单击,则按钮应使用
模板
afterClicking
永久保存,并且按钮的 View 不应更改。也就是说,在第一次单击时,按钮使用模板
afterClicking
。在第二次单击时,按钮使用模板beforeClicking
。第三次单击按钮使用模板afterClicking
。第四次单击按钮使用模板afterClicking
。等等。由于使用了MVVM方法,我只想通过XAML来获得这种行为。
如何实现这种行为?
最佳答案
您可以使用EventTrigger处理点击。在事件触发器中,您提供了一个 Storyboard ,但在 Storyboard 中您无法更改模板。
您可以在附加属性中执行此操作,但是在您的示例中,您并不需要这样做,更典型地,您会影响单个属性:
<Style TargetType="Button">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="border" Background="Transparent" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="Black">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="BorderThickness">
<DiscreteThicknessKeyFrame Value="10" KeyTime="0" />
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
==讨论之后:ToggleButton版本:==
<Window.Resources>
<Style TargetType="ToggleButton">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Name="border" Background="Transparent" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="Black">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="BorderThickness" Value="10" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<ToggleButton>Hello World</ToggleButton>
</Grid>
关于c# - 单击按钮后如何更改模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33416584/