0

有谁知道有什么方法可以抑制滚动条上的 Vista 淡入淡出动画?

我只想暂时这样做,我不认为子类化是一种选择,因为滚动条是由自动滚动功能生成的“自动”滚动条(它是一个 .NET 应用程序,但我认为互操作是必需的)。

我想这样做的原因是因为控件的内容可以(并且将会)改变并导致垂直滚动条被自动隐藏。但是 - 这就是让我发疯的部分 - 如果用户在过去 1-2 秒内将鼠标悬停在滚动条上并且动画仍在进行中,那么滚动条会隐藏但动画仍然会继续并留下幽灵图像,因此 SB 似乎仍然存在,即使它确实不存在(无法单击它,并且最小化/恢复表单使其完全消失)。

我认为 Vista 使用某种计时器来制作这个动画,并希望可能有一些新的 API 来停止计时器(不幸的是,谷歌对此没有帮助)。或者,如果其他人遇到过这个问题并且知道解决它的不同方法,那也很棒。

在此先感谢,
亚伦

4

4 回答 4

1

这篇文章中的解决方法对我有用:

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/88abdb31-651b-4b47-ae24-8b923344c349

帖子中的示例使用 C++,但这里有一些 C# 代码说明了我如何通过 pinvoke 在 .NET 中使用它(在 Control 子类中工作......)

protected override void OnSizeChanged(EventArgs e)
{
    if (_vScrollVisible != VerticalScroll.Visible)
    {
        _vScrollVisible = VerticalScroll.Visible;

        if (!_vScrollVisible)
        {

            if (NativeMethods.IsThemeActive())
            {
                // Fix scrollbar fade issue                
                NativeMethods.SetWindowTheme(Handle, null, null);
            }
        }
    }
}

internal static class NativeMethods
{      
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    public static extern bool IsThemeActive();

    [DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
    public static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);
}
于 2011-08-30T06:34:34.897 回答
0

有任何理由有滚动条吗?您可以在不使用任何 Win32 API 技巧的情况下关闭它们,同时还可以设置窗口大小以适当地处理动画(或缩放动画)。

我认为您唯一的其他选择是滚动您自己的 Window 对象,这将是一种皇家痛苦。

于 2009-02-21T05:58:27.627 回答
0

这是我也想知道的效果。

我编写了一个从 ContainerControl 派生的控件,其中子控件可以通过用户交互来增长或缩小。所以我花了一些时间设置自己的 LayoutEngine 来获取子控件所需的布局。但即使是这个动画不间断的 SB 也是肮脏的。我有一个解决方法——请不要把它当作解决方案——在布局方法中,我在进行布局之前将焦点设置在容器控件上。这对我行得通...

rp

另一种解决方法...

is to inherit from the ScrollableControl (Panel, ...) and to

覆盖 WndProc 方法并使用 PreventScrollAnimation 方法。这将吃掉所有在滚动条中有命中测试的 WM_NCMOUSEMOVE 消息。所以这将防止内部开始滚动条的褪色。顺便说一句,衰落是在 VISTA-UI 中使用计时器回调实现的,因此不可能停止它。

const int WM_NCMOUSEMOVE = 160;
const int HTHSCROLL = 6;
const int HTVSCROLL = 7;

bool PreventScrollAnimation(ref Message m)
{
    if (m.Msg == WM_NCMOUSEMOVE)
    {
        if ((m.WParam.ToInt32() == HTHSCROLL) ||
            (m.WParam.ToInt32() == HTVSCROLL))
        {
            m.Result = IntPtr.Zero;
            return true;
        }
    }
    return false;
}

protected override void WndProc(ref Message m)
{
    if (PreventScrollAnimation(ref m))
        return;

    base.WndProc(ref m);
}
于 2009-02-25T10:03:06.947 回答
0

如果您指的是应用程序或系统范围内的滚动条,这个问题并不完全清楚。如果您指的是系统范围,那么除了为您的整个计算机设计一个全新的主题之外,我不确定您还能做什么。但是,如果您指的是仅更改您自己的应用程序,则可以使用 WPF 控件模板修改滚动条行为以执行您所描述的操作。

如果您有 Expression Blend,这很容易做到,因为它可以创建默认滚动条的副本,您可以根据自己的喜好对其进行修改(例如在这种情况下将淡入淡出的时间更改为零)。此链接并不完全是您正在寻找的内容,但它应该让您了解其中可能涉及的内容。

如果您没有 Expression Blend,仍然可以手动编写相同的代码,因为它只是 XAML 文本(即使 Blend 生成它),但学习如何这样做需要更多的努力。

Windows Presentation Foundation Unleashed的第 15 章(一本好书,原因有很多)解释了如何在 Win32 和 Windows 窗体应用程序中使用 WPF,并将其用作 Win32 和 Windows 窗体应用程序的宿主,如果您无法将整个应用程序移植到 WPF 但仍想移植,这很方便有选择地使用一些 WPF 功能。

于 2009-03-18T07:39:49.447 回答