当前位置: 首页 > news >正文

WINUI/WPF——Button不同状态下图标切换

开发环境

VS2022

.net6

MVVMToolkit

实现思路

在状态管理器下,不同状态设置设置不同的图标和属性,以使状态能清晰分辨。

代码实现

以下为WINUI下Style实现示例,WPF可作参考:

 <Style x:Key="DynamicIconButtonStyle" TargetType="Button"><Setter Property="FocusVisualMargin" Value="-3" /><Setter Property="Height" Value="64" /><Setter Property="Width" Value="278" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Borderx:Name="border"Background="#76C265"CornerRadius="8"><!--  主布局  --><StackPanelx:Name="ContentStack"HorizontalAlignment="Center"Orientation="Horizontal"><!--  正常状态图标(通过 Content 传入)  --><ContentPresenterx:Name="NormalIconPresenter"Margin="0,0,8,0"Content="{TemplateBinding Content}" /><!--  禁用状态图标(通过 Tag 传入)  --><ContentPresenterx:Name="DisabledIconPresenter"Content="{TemplateBinding Tag}"Visibility="Collapsed" /></StackPanel><VisualStateManager.VisualStateGroups><VisualStateGroup x:Name="CommonStates"><VisualState x:Name="Normal"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalIconPresenter" Storyboard.TargetProperty="Visibility"><DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="DisabledIconPresenter" Storyboard.TargetProperty="Visibility"><DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" /></ObjectAnimationUsingKeyFrames></Storyboard></VisualState><VisualState x:Name="Disabled"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="Background"><DiscreteObjectKeyFrame KeyTime="0" Value="#E8EBED" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalIconPresenter" Storyboard.TargetProperty="Visibility"><DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" /></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetName="DisabledIconPresenter" Storyboard.TargetProperty="Visibility"><DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /></ObjectAnimationUsingKeyFrames><!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonText" Storyboard.TargetProperty="Foreground"><DiscreteObjectKeyFrame KeyTime="0" Value="#A8A9AB" /></ObjectAnimationUsingKeyFrames>--></Storyboard></VisualState></VisualStateGroup></VisualStateManager.VisualStateGroups></Border></ControlTemplate></Setter.Value></Setter></Style>

Page中Button代码如下:

<ButtonMargin="0,0,32,0"HorizontalAlignment="Center"Command="{x:Bind ViewModel.ReRegistrationCommand}"FontSize="32"Style="{StaticResource DynamicIconButtonStyle}"Visibility="{x:Bind ViewModel.CurCase.IsCBCT, Converter={StaticResource ReverseBooleanToVisibilityConverter}}"><Button.Content><StackPanel VerticalAlignment="Center" Orientation="Horizontal"><FontIconFontFamily="{StaticResource PatientPosition}"FontSize="32"Glyph="&#xe60b;" /><TextBlock Foreground="White" Text="重新配准" /></StackPanel></Button.Content><Button.Tag><StackPanel VerticalAlignment="Center" Orientation="Horizontal"><FontIconFontFamily="{StaticResource PatientPosition}"FontSize="32"Glyph="&#xe7cb;" /><TextBlock Foreground="#A8A9AB" Text="重新配准" /></StackPanel></Button.Tag>
</Button>

在VM中调用如下,button是否可用通过执行CanExecute来决定。

[RelayCommand(CanExecute = nameof(CanReRegistration))]private void ReRegistration()
{UploadingSurgicalPlan.UploadDruingSurgery(curCase, true);
}

以上代码中涉及的CanReRegistration如下:

private bool CanReRegistration()
{return BluetoothConnect && CurCase.Stage >= CaseStage.Uploaded;
}
CanReRegistration为CanExecute执行的方法。

http://www.xdnf.cn/news/1063513.html

相关文章:

  • LLM-201: OpenHands与LLM交互链路分析
  • 【JS-4.3-鼠标常用事件】深入理解DOM鼠标事件:全面指南与最佳实践
  • Rabbitmq的五种消息类型介绍,以及集成springboot的使用
  • React JSX语法
  • OCCT基础类库介绍:Modeling Algorithm - Features
  • 软件工程期末试卷简答题版带答案(共21道)
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • Vue3 + TypeScript + xlsx 导入excel文件追踪数据流转详细记录(从原文件到目标数据)
  • 领域驱动设计(DDD)【3】之事件风暴
  • EasyExcel导出极致封装 含枚举转换 分页导出
  • GitHub Copilot快捷键
  • 缓存与加速技术实践-Kafka消息队列
  • 腾讯云IM即时通讯:开启实时通信新时代
  • Python中字符串常用的操作方法
  • Linux TCP/IP协议栈中的TCP输入处理:net/ipv4/tcp_input.c解析
  • 学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)
  • AI与SEO关键词协同进化
  • IEC61850 通信协议测试验证方法详解
  • 解锁K-近邻算法:数据挖掘的秘密武器
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • 【AI论文】扩散二元性
  • 面试题-定义一个函数入参数是any类型,返回值是string类型,如何写出这个函数,代码示例
  • ncu学习笔记01——合并访存
  • 系统化的Node.js服务器搭建攻略
  • 将Python的JSON字符串转换为JSON
  • UE5 游戏模板 —— FirstShootGame
  • Docker简单介绍与使用以及下载对应镜像(项目前置)
  • 【软考高级系统架构论文】论湖仓一体架构及其应用
  • RNN工作原理和架构
  • Python的6万张图像数据集CIFAR-10和CIFAR-100说明