代码之家  ›  专栏  ›  技术社区  ›  Ben Hutchison

为什么“我的Windows窗体”按钮上缺少Aero视觉样式的动画?

  •  2
  • Ben Hutchison  · 技术社区  · 6 年前

    我写了一个c windows窗体程序,在windows 7上有一些按钮。这些按钮使用内置的Aero样式,包括悬停和按下状态,但它们不会像其他程序中的按钮那样在不同的状态之间平滑地淡出。相反,他们只是立即过渡到新的状态。我想让他们用默认的气动过渡动画。

    我试过的

    • 确保动画出现在其他程序中,如操作系统提供的运行、打开和保存对话框。
    • 确保在“系统属性”>“性能选项”中启用了“在窗口中设置元素和控件的动画”。
    • 在Windows7Basic、Windows7Aero和自定义视觉样式之间切换了我的操作系统视觉样式。
    • 添加了一个应用程序清单,该清单指定了 dependentAssembly Microsoft.Windows.Common-Controls .
    • 确保我在打电话 Application.EnableVisualStyles() 在展示任何表格之前。
    • 保证的 Application.RenderWithVisualStyles true .
    • Rendering Controls with Visual Styles 看看我有没有遗漏什么。
    1 回复  |  直到 6 年前
        1
  •  2
  •   Ben Hutchison    6 年前

    感谢马修斯·普拉塔(出于某种原因) YouTube video ,我知道我必须单独设置属性 ButtonBase.FlatStyle = FlatStyle.System 在我的每一个按钮控件上,我不想有损坏的动画。

    要修复窗体中的所有控件,可以在visual studio窗体设计器中多选它们并使用“属性”面板。

    或者,您可以使用循环按程序修复窗体中的所有控件。

    InitializeComponent();
    foreach (Control control in Controls)
    {
        if (control is ButtonBase buttonControl)
        {
            buttonControl.FlatStyle = FlatStyle.System;
        }
    }
    

    这看起来非常荒谬,你必须这样做只是为了不打破动画。我的应用程序很简单,只有一个表单,但是如果您有许多表单,则需要一种方法将此修复程序应用到整个应用程序中。如果您的类继承结构不允许您将此修复添加到超类,可能是因为您的表单类继承自各种不可更改(可能是第三方)的超类,该怎么办?您可以提取一个helper方法,但是当您创建一个新的表单类而忘记调用helper方法时呢?

    应该有办法选择加入 FlatStyle.System 作为应用程序范围的设置,它甚至可以在默认情况下启用,因为操作系统中的每个其他程序都在按钮上使用这些动画。