按钮 VisualState Focused 不起作用

2024-05-11

我试图在单击按钮时更改按钮的字体颜色。我尝试了很多不同的方法,但没有一个有效。这是我尝试过的最新方法,我认为应该是答案,但它不起作用。有人可以帮忙吗? PointerOver 工作正常,但单击按钮时 Focused 没有执行任何操作。

<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Foreground" Value="Black" />
    <Setter Property="FontWeight" Value="Normal" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid
                    x:Name="RootGrid"
                    Background="{TemplateBinding Background}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>

                            <VisualState x:Name="PointerOver">
                                <VisualState.Setters>
                                    <Setter Target="ContentPresenter.FontWeight" Value="Bold" />
                                </VisualState.Setters>
                            </VisualState>

                            <VisualState x:Name="Pressed"/>

                            <VisualState x:Name="Focused">
                                <VisualState.Setters>
                                    <Setter Target="ContentPresenter.Foreground" Value="Purple" />
                                </VisualState.Setters>
                            </VisualState>

                            <VisualState x:Name="Disabled">
                            </VisualState>
                        </VisualStateGroup>

                    </VisualStateManager.VisualStateGroups>
                    <ContentPresenter
                        x:Name="ContentPresenter"
                        Content="{TemplateBinding Content}"
                        ContentTransitions="{TemplateBinding ContentTransitions}"
                        ContentTemplate="{TemplateBinding ContentTemplate}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

根据评论进行编辑: 添加说明-我在发布此问题之前尝试使用 Pressed,但它没有达到我想要的效果。单击后,我希望颜色保持应用状态,直到单击另一个按钮,然后单击的新按钮中的文本将更改颜色,并且单击的上一个按钮将返回到默认颜色。按下后,一旦松开鼠标按钮,文本就会恢复为默认值。

编辑基于答案的建议: 还提供周围的代码以查看是否在其他地方犯了错误。

    <Page.Resources>
    <Style x:Key="ButtonStyle" TargetType="Button">
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="FontWeight" Value="Normal" />
        <Setter Property="UseSystemFocusVisuals" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>

                                <VisualState x:Name="PointerOver">
                                    <VisualState.Setters>
                                        <Setter Target="ContentPresenter.FontWeight" Value="Bold" />
                                    </VisualState.Setters>
                                </VisualState>

                                <VisualState x:Name="Pressed"/>

                                <VisualState x:Name="Disabled">
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused">
                                    <VisualState.Setters>
                                        <Setter Target="ContentPresenter.Foreground" Value="Purple" />
                                    </VisualState.Setters>
                                </VisualState>
                                <VisualState x:Name="Unfocused" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter x:Name="ContentPresenter"
                      Content="{TemplateBinding Content}"
                    ContentTransitions="{TemplateBinding ContentTransitions}"
                    ContentTemplate="{TemplateBinding ContentTemplate}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button Style="{StaticResource ButtonStyle}" Content="Button" HorizontalAlignment="Left" Margin="10,180,0,0" VerticalAlignment="Top" />
    <Button Style="{StaticResource ButtonStyle}" Content="Button" HorizontalAlignment="Left" Margin="100,180,0,0" VerticalAlignment="Top"/>
    <Button Style="{StaticResource ButtonStyle}" Content="Button" HorizontalAlignment="Left" Margin="194,180,0,0" VerticalAlignment="Top"/>
</Grid>

在UWP中,有一个系统级焦点视觉应用于Button以及许多其他默认控件。如果您想像您在中定义的那样管理自己的焦点视觉Focused视觉状态,尝试设置

<Setter Property="UseSystemFocusVisuals" Value="False" />

以你的风格。

另外,自定义焦点视觉状态是not inside CommonStates but FocusStates。所以你需要将你的焦点状态移到里面

<VisualStateGroup x:Name="FocusStates">
    <VisualState x:Name="Focused">
        <VisualState.Setters>
            <Setter Target="ContentPresenter.Foreground" Value="Purple" />
        </VisualState.Setters>
    </VisualState>
    <VisualState x:Name="Unfocused" />
</VisualStateGroup>

Update

当您想保持对点击的关注时,您需要两件事。首先,你需要AllowFocusOnInteraction set to True。默认情况下,它已经True on a Button。其次,你要处理PointerFocused状态连同Focused一。因此,将您的焦点状态替换为以下内容

<VisualStateGroup x:Name="FocusStates">
    <VisualState x:Name="Focused">
        <VisualState.Setters>
            <Setter Target="ContentPresenter.Foreground" Value="Purple" />
        </VisualState.Setters>
    </VisualState>
    <VisualState x:Name="PointerFocused">
        <VisualState.Setters>
            <Setter Target="ContentPresenter.Foreground" Value="Purple" />
        </VisualState.Setters>
    </VisualState>
    <VisualState x:Name="Unfocused" />
</VisualStateGroup> 

Why? Because two states are happening around the same time when you click a Button - Pressed from CommonStates and PointerFocused from FocusStates. The Focused state is generally triggered when you tap the Tab key.


<Style x:Key="ButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Foreground" Value="Black" />
    <Setter Property="FontWeight" Value="Normal" />
    <Setter Property="FontSize" Value="40" />
    <Setter Property="UseSystemFocusVisuals" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />

                            <VisualState x:Name="PointerOver">
                                <VisualState.Setters>
                                    <Setter Target="FocusContentPresenter.FontWeight" Value="Bold" />
                                    <Setter Target="ContentPresenter.FontWeight" Value="Bold" />
                                    <Setter Target="ContentPresenter.Foreground" Value="Pink" />
                                </VisualState.Setters>
                            </VisualState>

                            <VisualState x:Name="Pressed">
                                <VisualState.Setters>
                                    <Setter Target="ContentPresenter.Foreground" Value="Purple" />
                                </VisualState.Setters>
                            </VisualState>

                            <VisualState x:Name="Disabled">
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused">
                                <VisualState.Setters>
                                    <Setter Target="FocusContentPresenter.Foreground" Value="Purple" />
                                    <Setter Target="FocusContentPresenter.(UIElement.Opacity)" Value="1" />
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="PointerFocused">
                                <VisualState.Setters>
                                    <Setter Target="FocusContentPresenter.Foreground" Value="Purple" />
                                    <Setter Target="FocusContentPresenter.(UIElement.Opacity)" Value="1" />
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="Unfocused" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <ContentPresenter x:Name="ContentPresenter" Content="{TemplateBinding Content}" ContentTransitions="{TemplateBinding ContentTransitions}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                    <ContentPresenter x:Name="FocusContentPresenter" Opacity="0" Content="{TemplateBinding Content}" ContentTransitions="{TemplateBinding ContentTransitions}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按钮 VisualState Focused 不起作用 的相关文章

  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • TinyMCE 的 addButton() 函数中所有可能的设置属性是什么?

    The 文档 http www tinymce com wiki php API3 method tinymce Editor addButton对此还不是很清楚 name 字符串 要添加的按钮名称 设置 对象 带有标题 cmd 的设置对象
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 使用“切换”按钮切换日夜主题

    我已经实施了一个开关按钮在我的布局中并且想要使用 Android日夜主题使用按钮 dayNight 主题工作正常 但问题是 当我点击开关它不会立即起作用 我必须改变活动然后它就起作用了 例如如果我在一个活动中单击开关 它不会执行任何操作 直
  • 使用“isostore:/”方案从 XAML 中的独立存储访问图像

    我已经从网上下载了图像并将它们保存到独立存储中 现在我想在我的 XAML 文件中访问这些图像 并提供一个 Uri 作为对它们的引用 我已经使用 IsoStoreSpy 验证它们是否正确存储在我期望的位置 并且如果我打开文件并读取字节流 我可
  • Silverlight:在 XAML 中创建 DataTemplate,并在代码中分配它?

    是否可以在 XAML 中创建 DataTemplate 并通过代码将其应用到各种控件 如果是这样 我如何引用我在 XAML 中构建的 DataTemplate 如果你有
  • 在 Win32 C# WPF 应用程序中使用 UWP C++ dll

    我正在尝试使用 Microsoft 在 Win32 C WPF 应用程序内的 UWP 示例之一中提供的 SimpleCommunication C DLL https github com Microsoft Windows univers
  • 如何将子属性的触发器设置为父属性?

    我有一个带有 ToggleButton ExpanderButton 的 TreeView 切换按钮有两个图像 一张用于展开 另一张用于未展开 但是 当我选择 TreeViewItem 时 我用不同的颜色突出显示它 并且我也想更改图像的颜色
  • 绑定Xaml位图图像

    我有位图图像变量 我想将其绑定到我的 xaml 窗口 System Reflection Assembly thisExe thisExe System Reflection Assembly GetExecutingAssembly st
  • 如何通过单击按钮调用 PHP 函数

    我创建了一个名为的页面functioncalling php包含两个按钮 Submit and Insert 我想测试单击按钮时执行哪个函数 我希望输出出现在同一页面上 因此 我创建了两个函数 每个按钮一个
  • 使用 ExtendedExecutionSession 或 ExtendedExecutionForegroundSession 暂停 UWP

    UWP 我无法禁用暂停 我需要你的知识 这是我的简单例子来了解问题 这是计数器增加 减少应用程序 实际上 我想 356 x 24 小时不间断地监控设备的温度 我希望在挂起模式下增加 value 但 UWP 在挂起期间不起作用 Why 上传的
  • 从 DataGridColumn 中绑定到 DataContext 属性

    财产Foo在我的DataContext ViewModel Visibility Foo 但我不知道如何访问Foo里面一个Column 在这种情况下 我认为它可能正在寻找Foo在任何绑定到的对象中DataGrid ItemsSource
  • 在 UWP 中拖放到银行帐户列表中

    我有一个本地银行的通用 Windows 应用程序 我正在处理汇款视图 他们需要使用 UWP 应用程序中的拖放功能将资金从一个帐户转移到另一个帐户 我已经制作了动画部分 但在将列表项拖放到 帐户至 列表后需要帮助 I ll attach a
  • 如何在按钮上执行mysql [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions PHP 单击按钮时如何执行 SQL
  • 按下按钮时有多个命令

    我想在单击按钮时运行多个功能 例如我希望我的按钮看起来像 self testButton Button self text test command func1 command func2 当我执行此语句时 我收到错误 因为我无法将某些内容
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 如何创建一个快速加载的包装列表框?

    我制作了一个很好的小三项宽列表 用作开关 它看起来像这样 看起来不错吧 好吧 我在垂直滚动列表中大约有 130 个这样的图块 并且需要很长时间才能加载 根据性能分析工具 每个元素的渲染时间约为 18 毫秒 这给了我大约 2 3 秒的渲染时间
  • 使用 VSTest 代替 MSTest 运行单元测试用例

    我在 TFS2010 服务器上有一个 x64 平台 C 解决方案 VS2012 我已将一个单元测试项目 也是 x64 附加到此解决方案并创建了一个构建定义 当我对构建进行排队时 它成功了 但单元测试用例不会被执行 这是因为 MSTest 是
  • UWP XAML 使用 VisualStateManager 更改目标的样式

    我正在使用 Style 来自定义我的组件
  • 更改android中禁用按钮的颜色

    有没有办法通过样式或其他形式更改 android 中禁用按钮的颜色 我目前有以下内容 可绘制 button default xml

随机推荐

  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • Python 排列(包括子字符串)

    我遇到过这个帖子 如何在Python中生成列表的所有排列 https stackoverflow com questions 104420 how to generate all permutations of a list in pyth
  • 从 json 文件加入时添加角色 (autorole)

    我对 JS 相当陌生 为了学习 我决定为 Discord 制作一个机器人 我学到了很多并且正在继续学习 我有一个 autorole 的想法 我知道传统的做法 bot on guildMemberAdd member gt var role
  • 电话号码的 Swift 2 国家/地区代码

    我正在尝试从 iPhone 用户处获取国家 地区代码 我不确定是否有有关该国家 地区以及某些应用程序 如 Viber 如何建议拨号代码的信息 我到目前为止 let currentLocale NSLocale currentLocale l
  • Node.js 和代码优先

    我使用代码优先方法开发实体框架 现在我正在学习 Node js 我想知道是否有一种方法可以使用 Node js 和一些库来实现相同的代码优先方法 我正在考虑使用MySql作为数据库 你可以看看续集 http docs sequelizejs
  • 服务不可用:复制 Google 文档时出现 DOCS

    突然遇到一个问题 即 Google DOCS 服务在调用一些复制元素后失败 有趣的是 它实际上复制了第一个元素 但是当它进入 for 内的第二个循环时 它失败并给出以下错误 服务不可用 文件 该脚本在我们公司内部发布后 可以正常运行几个月
  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 没有 Listview 的 Android 导航抽屉

    我想创建一个像导航抽屉一样的滑动菜单 但是将会有文本视图和图像视图 就像半活动一样 有可能做到这一点吗 您可以使用NavigationDrawer来自支持库 包括一个FrameLayout作为一个孩子DrawerLayout并使androi
  • 将 pandas 多索引数据帧转换为嵌套字典

    我有一个 pandas 多索引数据框 我试图将其输出为嵌套字典 create the dataset data clump thickness 0 0 274 0 0 1 19 0 1 0 67 0 1 1 12 0 2 0 83 0 2
  • 如何将 kubernetes LoadBalancer Ingress URL 发布到 aws Route53

    今天 当我通过 aws 使用 kubernetes 启动一个应用程序时 它公开了一个公开可见的 LoadBalancer Ingress URL 但是要将其链接到我的域以使公众可以访问该应用程序 我需要在每个设备上的浏览器中手动进入 aws
  • Docker-compose v3 不持久保存 postgres 数据库

    在 docker compose v3 容器关闭并重新启动后 我很难保留 postgres 数据 这似乎是一个常见问题 但经过大量搜索后我无法找到有效的解决方案 我的问题与这里类似 如何使用卷将数据保存在 dockerized postgr
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 在 Eclipse 工作区中搜索字符串

    如何在完整的eclipse工作区中搜索字符串 我无法在 Eclipse 工作区中找到文本 但是我无法在工作区中找到指定的字符串 在顶层菜单中 选择 搜索 gt 文件搜索 然后在底部附近 在范围内 有一个选项可以选择整个工作区 为您 文件搜索
  • 如何在 Django 1.4 中自定义管理过滤器

    我是 Python 和 Django 开发的新手 我从社区提供的易于阅读的示例中学到了很多东西 但最近我想为 Django 附带的管理控制台实现一个自定义的管理过滤器 我进行了很多搜索 只发现了一些过时的方法来完成它 例如 Django 1
  • 如何将exe异常路由回VB6应用程序?

    我有一个 vb6 应用程序 它将调用 mencoder exe 它是 mplayer 的一部分 用于将某些文件转换为 flv 格式 每当我尝试转换这个 opendivx 文件时 我都会从 mencoder 收到这个奇怪的未处理异常问题 目前
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 如何在 Rails rspec 中测试 cookie 过期时间

    在 rspec 中设置 cookie 有很多困惑http relishapp com rspec rspec rails v 2 6 dir controller specs file cookies http relishapp com
  • 按钮 VisualState Focused 不起作用

    我试图在单击按钮时更改按钮的字体颜色 我尝试了很多不同的方法 但没有一个有效 这是我尝试过的最新方法 我认为应该是答案 但它不起作用 有人可以帮忙吗 PointerOver 工作正常 但单击按钮时 Focused 没有执行任何操作