首页 > 其他分享 >WPF 视觉状态VisualState使用

WPF 视觉状态VisualState使用

时间:2024-06-23 16:21:29浏览次数:25  
标签:mouseoverstate false VisualState GoToState 视觉 WPF Border public mouseleavestate

VisualState基本使用

首先搭建一个自定义控件,继承自ContentControl,自动生成了这些文件
image
由于CustomButtonCustom命名空间中,所以改一下xaml中的引用

xmlns:local="clr-namespace:WpfApp1.Custom"
  • 定义部件和视觉状态
    TemplatePart是模板中的部件名
    TemplateVisualState是模板中的样式名
[TemplatePart(Name = "P_Border")]
[TemplateVisualState(Name = mouseoverstate, GroupName = mousegroup)]
[TemplateVisualState(Name = mouseleavestate, GroupName = mousegroup)]
public class CustomButton : ContentControl
{
    public const string mouseoverstate = "mouseover";
    public const string mouseleavestate = "mouseleave";
    public const string mousegroup = "mousegroup1";
}
  • 添加样式
    推荐把视觉状态放在模板的根元素下,这个例子中是Border
    需要注意的是,由于使用了(Border.Background).(SolidColorBrush.Color),所以BorderBackground必须有个预设值
<Style TargetType="{x:Type local:CustomButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomButton}">
                <Border
                        x:Name="P_Border"
                        Padding="5"
                        CornerRadius="5"
                        Background="Transparent"
                        BorderBrush="Transparent"
                        BorderThickness="0">
                    <TextBlock Text="{TemplateBinding Content}" Foreground="White" HorizontalAlignment="Center"/>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="mousegroup1">
                            <!--GoToState第三个参数useTransitions为false时进入这里-->
                            <VisualState x:Name="mouseover">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:0" To="#FF16b777"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="mouseleave">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:0" To="#CC16b777"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  • 后台代码
    这里在鼠标事件中改变视觉状态
public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    VisualStateManager.GoToState(this, mouseleavestate, false);
}

protected override void onm ouseEnter(MouseEventArgs e)
{
    base.OnMouseEnter(e);
    VisualStateManager.GoToState(this, mouseoverstate, false);
}

protected override void onm ouseLeave(MouseEventArgs e)
{
    base.OnMouseLeave(e);
    VisualStateManager.GoToState(this, mouseleavestate, false);
}
  • 效果
    image

增加VisualTransition过渡效果

但这没有过渡,添加过渡需要设置GoToState(this, mouseoverstate, true)
同时还要添加过渡效果的xaml元素

<VisualStateGroup x:Name="mousegroup1">
    <!--GoToState第三个参数useTransitions为true时进入这里-->
    <VisualStateGroup.Transitions>
        <!--from是前一个状态名,to是后一个状态名-->
        <VisualTransition To="mouseover">
            <Storyboard>
                <!--(Border.Background).(SolidColorBrush.Color)是PropertyPath类型限定的单个属性语法,格式为(targetTtype.property)-->
                <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:1" To="#FF167777"/>
            </Storyboard>
        </VisualTransition>
        <VisualTransition To="mouseleave">
            <Storyboard>
                <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:1" To="#AA167777"/>
            </Storyboard>
        </VisualTransition>
    </VisualStateGroup.Transitions>
    <!--GoToState第三个参数useTransitions为false时进入这里-->
    <VisualState x:Name="mouseover">
        <Storyboard>
            <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:0" To="#FF167777"/>
        </Storyboard>
    </VisualState>
    <VisualState x:Name="mouseleave">
        <Storyboard>
            <ColorAnimation Storyboard.TargetName="P_Border" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:0" To="#AA167777"/>
        </Storyboard>
    </VisualState>
</VisualStateGroup>

再把GoToState(this, mouseoverstate, false)改为true
但注意OnApplyTemplate中不要改,因为那里是首次加载,许需要过渡

  • 效果
    image

标签:mouseoverstate,false,VisualState,GoToState,视觉,WPF,Border,public,mouseleavestate
From: https://www.cnblogs.com/ggtc/p/18263524

相关文章

  • 计算机视觉解决什么问题?
    本节课为「计算机视觉CV核心知识」第一节课正式课;「AI秘籍」系列课程:人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识Hi,大家好。我是茶桁。老同学对我应该都很熟悉了,那新来的同学可能还不太认识我。不认识的......
  • 2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
    6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。DiffusionModels1、AutoregressiveModelBeatsDiffusion:LlamaforScalableImageGenerationLlamaGen,是一个新的图像生成模型,它将原始的大型语言模型......
  • WPF频繁更新UI卡顿问题
    我的WPF程序,需要连接PLC、CCD、RFID、扫码枪、控制卡所以我写了InitHardware();privatevoidInitHardware(){vartasks=newTask[]{//后台线程长连接,不取消令牌Task.Factory.StartNew(()=>InitConnPLC(),CancellationToken.None,Ta......
  • RSpromoter:基于视觉模型的遥感实例分割提示学习
    RSpromoter:基于视觉模型的遥感实例分割提示学习摘要-利用来自SA-1B的大量训练数据,分段任意模型(SAM)展示了显著的泛化和零样本能力。然而,作为一种与类别无关的实例分割方法,SAM在很大程度上依赖于先前的手动指导,包括点、框和粗粒度掩码。此外,它在遥感图像分割任务中的性能在很大程度......
  • 计算机视觉:2023 年回顾和 2024 年趋势
            计算机视觉(CV)领域经历了充满非凡创新和技术飞跃的一年。这一年见证了人工智能驱动的视觉技术的显著进步,深刻改变了我们对视觉数据的交互和解读。从生成式人工智能奇迹到复杂的分析工具,CV不仅不断发展,而且重新定义了其界限。 2023年        SA......
  • Qt+OpenCV通用视觉框架全套源码,类似easyvision
    Qt+OpenCV通用视觉框架全套源码,类似easyvision。工具可扩展。所有算法均无封装,可以根据自己需要补充自己的工具。基于Qt5.12.12+VS2019+OpenCV开发实现,支持多相机多线程,每个工具都是单独的DLL,主程序通过公用的接口访问以及加载各个工具。包含涉及图像算法的工具、......
  • 计算机视觉(CV)技术:优势、挑战与前景
    摘要计算机视觉作为人工智能的关键领域之一,正迅速改变我们的生活和工作方式。本文将探讨CV技术的主要优势、面临的挑战以及未来的发展方向。关键词计算机视觉,人工智能,数据处理,自动化,伦理问题目录引言计算机视觉技术的优势计算机视觉技术的挑战实战案例分析结论与......
  • WebView2UI - 在WPF之中使用WebView2的一些经验总结
    项目地址:https://gitee.com/skyw18/WebView2UI项目地址:https://github.com/skyw18/WebView2UIwebview简介与生命周期:WPF应用中的WebView2入门-MicrosoftEdgeDeveloperdocumentation|MicrosoftLearn具体代码可以参考微软官方示例文档WPF示例应用-MicrosoftEdge......
  • 【C#】WPF 类库项目 无法创建 “资源字典” 文件
    解决办法打开项目工程文件(project.csproj)在标签添加下面红色的三句话<Deterministic>true</Deterministic><ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids><WarningLevel>......
  • WPF程序本地化要点梳理
    WPF程序支持国际化的编码、语言、布局等,能够设置根据目标市场实现文字显示的本地化。程序本地化要点:1.给项目的.csproj文件的无条件的元素添加类似zh-CN的标记,编译时会把可国际化的元素单独生成一个<项目名称>.resources.dll文件,供翻译使用。注:本方法通过dll单独存储可......