使用视觉状态管理器设置前景时出现问题

2023-11-23

我有一个 WPF 应用程序,我正在尝试使用 .Net v4 视觉状态管理器设置 TextBox 的样式。具体来说,我尝试设置 MouseOver 状态的前景和背景的颜色。

正在发生的情况是,虽然背景和边框发生了完美的变化,但前景却没有。如果我使用的画笔通过 StaticResource 获取颜色,则前景根本不会改变。如果我使用的画笔通过 DynamicResource 获取颜色,那么当我将鼠标悬停在文本框上时,所有文本框的前景都会发生变化。显然,要么我做错了什么,要么我想做的事根本不可能用 VSM 实现(这会相当令人失望)。

以下是我正在使用的资源:

<Color x:Key="ControlBackgroundColor" R="178" G="178" B="178" A="255" />
<Color x:Key="ControlForegroundColor" R="0" G="0" B="0" A="255" />
<Color x:Key="BorderColor" R="127" G="127" B="127" A="255" />
<Color x:Key="MouseOverControlBackgroundColor" R="0" G="0" B="0" A="255" />
<Color x:Key="MouseOverControlForegroundColor" R="255" G="255" B="255" A="255" />
<Color x:Key="MouseOverBorderColor" R="178" G="178" B="178" A="255" />

<SolidColorBrush PresentationOptions:Freeze="True" x:Key="ControlBackgroundBrush" Color="{DynamicResource ControlBackgroundColor}" />
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="ControlForegroundBrush" Color="{DynamicResource ControlForegroundColor}" />
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="BorderBrush" Color="{DynamicResource BorderColor}" />

<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverControlBackgroundBrush" Color="{DynamicResource MouseOverControlBackgroundColor}" />
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverControlForegroundBrush" Color="{DynamicResource MouseOverControlForegroundColor}" />
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverBorderBrush" Color="{DynamicResource MouseOverBorderColor}" />

<Style TargetType="{x:Type TextBox}" >
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="Margin" Value="1" />
    <Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}" />
    <Setter Property="Background" Value="{DynamicResource ControlBackgroundBrush}" />
    <Setter Property="Foreground" Value="{DynamicResource ControlForegroundBrush}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid x:Name="RootElement">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="MouseOverBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" To="{DynamicResource MouseOverBorderColor}" Duration="0:0:0.3"/>
                                    <ColorAnimation Storyboard.TargetName="MouseOverBorder" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" To="{DynamicResource MouseOverControlBackgroundColor}" Duration="0:0:0.3"/>
                                    <ColorAnimation Storyboard.TargetName="PART_ContentHost" Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)" To="{DynamicResource MouseOverControlForegroundColor}" Duration="0:0:0.3"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
                        <Grid x:Name="ContentGrid">
                            <Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent" Background="Transparent">
                                <ScrollViewer x:Name="PART_ContentHost" Padding="{TemplateBinding Padding}" Foreground="{TemplateBinding Foreground}" BorderThickness="0" IsTabStop="False"/>
                            </Border>
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

对我来说很奇怪的是,无论我使用静态还是动态资源,以完全相同的方式创建和动画的背景和边框画笔都可以完美工作,但前景色却不然。

如果有人有任何想法,或者有更好的方法来做到这一点,我很想听听。

大卫·穆林 IMA技术公司


The VisualStateManager无法控制通过绑定设置值的属性。在你的例子中,两者Background and BorderBrush设置为本地值(Transparent),因此 VSM 可以为它们设置动画。另一方面,Foreground是使用设置TemplateBinding因此,如果绑定值有效,VSM 将无法为其设置动画。

这是一般限制VisualStateManager您将在所有使用它的示例中看到它。解决该问题的典型策略是使用图层和不透明度来提供彩色动画的错觉,而实际上发生的是从一个元素到另一个元素的淡入淡出。这是有效的,因为您可以完全控制隐藏层,并且不必将其绑定到任何东西。不幸的是,这不能满足您的需求,因为该元素不是静态的;您不能有两个文本框。

最终的效果是,我认为您不能同时为文本前景色设置动画并允许用户指定前景色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用视觉状态管理器设置前景时出现问题 的相关文章

随机推荐

  • Bgr32 PixelFormat 中的第四个通道是什么

    我目前正在用 C 做一些图像处理工作 我对 Bgr32 Pixel 格式感到困惑 以下描述来自于microsoft msdn http msdn microsoft com en us library system windows medi
  • Android 上的 Apache Commons 编解码器:找不到方法

    今天我尝试将 apache commons codec 包包含在我的 Android 应用程序中 但无法运行它 Android 无法找到方法 ord apache commons codec binary 并在 DDMS 中输出以下错误 0
  • Jquery UI 日期选择器。禁用日期数组

    我一直在尝试寻找 Jquery ui datepicker 问题的解决方案 但没有运气 这就是我想做的 我有一个应用程序 我正在执行一些复杂的 PHP 操作来返回一个 JSON 日期数组 我希望将其阻止在 Jquery UI Datepic
  • sin 和 cos 的向量化

    我正在玩编译器资源管理器并遇到了异常 我认为 如果我想让编译器向量化一个sin计算 using libmvec 我会写 include
  • C# 正则表达式排除字符串

    我得到了一个字符串集合 我想要的正则表达式就是收集所有以 http 开头的 href http www test com cat 1 one piece episodes href http www test com cat 2 movie
  • 有没有办法标记 docker 镜像中的前一层或恢复提交?

    假设有一个 docker 镜像 有人对其进行了更改 然后将其推送到 docker 存储库 然后我拉下图像 有没有办法获取该图像并运行上一层的容器 运行更改之前的版本 如果我运行 docker History 它将看起来像这样 docker
  • 如何克服“错误:在注册表中找不到对象‘jupyter.widget’”?

    我在 kubernetes 上的 jupyterhub 中运行 jupyterlab 我正在尝试使用例如显示小部件 from ipywidgets import interact interact x 0 100 10 def p x 50
  • 当创建的类也需要运行时值时进行依赖注入?

    假设您将系统划分为价值对象和服务对象 如 开发面向对象的软件 由测试引导 中所建议的 Misko Hevery 将这些对象称为 可更新对象 和 可注入对象 当您的值对象之一突然需要访问服务来实现其方法时会发生什么 假设您有一个很好的简单 V
  • Keras 在拟合期间淹没 Jupyter 单元输出(详细 = 1)

    当使用 verbose 1 选项在 Jupyter 笔记本中运行 keras 模型时 我开始得到的不是像以前那样的单行进度状态更新 而是批量更新的大量状态行 参见附图 重新启动 jupyter 或浏览器没有帮助 Jupyter笔记本服务器是
  • 多个日期范围重叠比较:如何有效地进行?

    要检查两个不同日期范围内的重叠 Start1 End1 and Start2 End2 我正在查 if Start1 lt End2 End1 gt Start2 overlap exists 问题是 如果我有五个日期范围 比较重叠的好方法
  • strcpy 当目标缓冲区小于 src 缓冲区时

    我试图了解 strcpy 和 strncpy 的区别 缺点 有人可以帮忙吗 void main char src this is a long string char dest 5 strcpy dest src printf s n de
  • 如何在Oracle动态SQL中转义“:”并且还具有绑定变量?

    我正在尝试将以下内容设为动态 SQL 但是 角色搞砸了 alter session set events sql trace sql asasasaass Example declare l trc cmd varchar2 500 l s
  • 时间表的数据库架构

    有人可以帮助我为时间表应用程序提供一个粗略的数据库架构吗 为不同的项目存储一段时间 2 周 内每天的小时数 前任 A 可以在同一天为项目 A 投入 3 小时 为项目 B 投入 4 小时 使其能够轻松获取项目总投入时间的报告 或者获取某个人所
  • VS2010静态链接问题

    我公司最近从VS2005升级到VS2010 我们有一个巨大的项目 其中使用了许多静态链接到 exe 中的模块 但是VS2010中的链接似乎存在一些问题 为了解释我们的问题 我们构建了一个最小的示例项目 其组成如下图所示 有一个应用程序使用库
  • GetHostEntry() 不再解析地址

    我最近从 NET v3 5 切换到 v4 0 Client Profile 第一次运行 GetHostEntry 时遇到问题 tcpClient SocketInfo SourceName remoteMatcher Host 88 255
  • Android 使地图上的蓝点消失或移除 v2

    我正在尝试替换我的应用程序地图上的蓝点 我的目的是显示一个图标形状的平面 而不是通常的蓝点 我实现了这一点并且它完美地工作如下 GoogleMap OnMyLocationChangeListener myLocationChangeLis
  • 子组件中的 ExpressionChangedAfterItHasBeenCheckedError

    我有一个父组件 它每秒更新一次其数组myValue 在子组件中 我想创建一个图表 该图表使用该数组作为数据 并在每次父组件更新时更新 当我运行此应用程序时 我收到此错误 错误 ExpressionChangedAfterItHasBeenC
  • 如果接口定义了 ReadOnly 属性,那么实现者如何为该属性提供 Setter?

    对于接口的实现者来说 有没有一种方法可以让ReadOnly定义属性使其成为完整的读 写Property 想象一下我定义一个接口来提供ReadOnly Property 即 只是给定值的吸气剂 Interface SomeInterface
  • 简单的 getColumnName(0) 调用会抛出无效的列索引:getValidColumnIndex

    我正在尝试编写一个 JTable 它从 ResultSet 获取数据 并使用它创建一个动态大小的表 其中包含来自 ResultSet 的适当列名称和行数据值 但我无法让 JDBC 动态获取列名称 我知道我的 select 语句很好 我可以使
  • 使用视觉状态管理器设置前景时出现问题

    我有一个 WPF 应用程序 我正在尝试使用 Net v4 视觉状态管理器设置 TextBox 的样式 具体来说 我尝试设置 MouseOver 状态的前景和背景的颜色 正在发生的情况是 虽然背景和边框发生了完美的变化 但前景却没有 如果我使