c# - 单击按钮后如何更改模板

标签 c# wpf xaml mvvm

我想在单击按钮后更改按钮的 View 。
例如,我有两个模板beforeClickingafterClicking:

<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/

相关文章:

c# - 使用 .Net Core 在 Linux 机器上查找内核数失败并出现错误(未终止的引用字符串)

c# - 相当于 C# 中的 PHP sha1,具有原始二进制格式,长度为 20

c# - WPF 和 WIndows 10. 窗口周围的不可见边框?

c# - DataGrid 的数据绑定(bind)不起作用?

c# - 在保护 WCF 服务方面需要帮助

c# - 自定义搜索组合框

c# - 通用 View 模型编辑支持

wpf - MVVM。在某些情况下向 View 添加代码是否合理?

wpf - 如何使用数据绑定(bind)更改 XAML 文件的样式?

silverlight - 当 uielements 有边距时 ScrollViewer 不起作用