当前位置: 首页 > 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.lqws.cn/news/467605.html

相关文章:

  • 对接支付宝,阿里云沙箱服务
  • 在Linux中如何编写*.service文件?
  • 【单调栈】-----【Largest Rectangle in a Histogram】
  • emscripten 编译 wasm 版本的 openssl
  • 蚂蚁百宝箱快速创建智能体AI小程序
  • 项目中后端如何处理异常?
  • 智慧水利数字孪生解决方案:百川孪生智领千行,100+标杆案例赋能智慧水利全域升级
  • 【LeetCode#第198题】打家劫舍(一维dp)
  • Compose笔记(二十七)--网格布局
  • SwinTransformer 改进:小波+注意力模块(Wavelet-Guided Attention)
  • 【LeetCode 热题 100】15. 三数之和——排序 + 双指针解法
  • WebeServer实现:学到了哪些东西
  • 缓存与加速技术实践-Kafka消息队列
  • Axios 在 Vue3 项目中的使用:从安装到组件中的使用
  • 【软考高级系统架构论文】论 SOA 在企业集成架构设计中的应用
  • 【软考高级系统架构论文】论多源数据集成及应用
  • AR眼镜与3D建模社区建设
  • stm32串口(uart)2转发到串口(uart)3实现
  • JVM知识点
  • 启动hardhat 项目,下载依赖的npm问题
  • React 虚拟dom
  • GNU Octave 基础教程(8):GNU Octave 常用数学函数
  • git的命令
  • IEC61850 通信协议测试验证方法详解
  • 经典:在浏览器地址栏输入信息到最终看到网页的全过程,涉及网络协议以及前后端技术
  • 我开源了一套springboot3快速开发模板
  • 八大架构宪法 - 技术使用指导说明文档
  • GitHub OAuth 认证示例
  • 人人都是音乐家?腾讯开源音乐生成大模型SongGeneration
  • springboot垃圾分类网站