【问题标题】:Fade between Tab Pages in a Tab Control在选项卡控件中的选项卡页之间淡入淡出
【发布时间】:2008-10-29 18:48:39
【问题描述】:

我有一个带有多个标签页的标签控件。我希望能够来回淡化标签。我在选项卡控件上看不到不透明度选项。当我从一个标签页切换到另一个标签页时,有没有办法产生淡入淡出效果?

【问题讨论】:

  • 这是winforms应用还是web应用?
  • winform 不是 wpf 应用程序。到目前为止,位图的想法似乎是最好的计划

标签: c# .net winforms animation tabcontrol


【解决方案1】:

标准窗口控件中没有神奇的淡入淡出开关。

您可以将选项卡的内容转储到位图(使用DrawToBitmapCopyFromScreen?),在 TabControl 前面显示该位图,切换选项卡,然后淡化位图。

【讨论】:

    【解决方案2】:

    我决定发布我为使我的解决方案发挥作用所做的工作。 GvS 有最接近的答案,并让我朝着正确的方向前进,所以我给了他(可能是她,但来吧)正确的答案复选标记,因为我不能给自己。 我从来没有弄清楚如何从一个选项卡“交叉淡入淡出”到另一个选项卡(降低一个选项卡的不透明度并提高另一个选项卡的不透明度),但我发现等待在位图上绘制一个灰色框,越来越多的灰色给它淡入我的背景的效果,这也是灰色的。然后,我将第二个选项卡作为灰色位图开始,我慢慢添加较少的灰色,并与每次迭代的选项卡图像相结合,使其具有淡化效果。

    这个解决方案会产生一个很好的淡入淡出效果(即使我自己这么说),但它是非常线性的。我将为 alphablend 变量使用随机数生成器,看看这是否会使其线性度降低一些,但用户可能会再次欣赏可预测性。顺便说一句,我使用 button_click 触发切换选项卡事件。

    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;
    
    public int alphablend;
    public Bitmap myBitmap;
    
        private void button1_Click(object sender, EventArgs e)
        {
            alphablend = 0;
            pictureBox1.Visible = true;
            myBitmap = new Bitmap(tabControl1.Width, tabControl1.Height);
            while (alphablend <= 246)
            {
                tabControl1.DrawToBitmap(myBitmap, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height));
                alphablend = alphablend + 10;
                pictureBox1.Refresh();//this calls the paint action
            }
            tabControl1.SelectTab("tabPage2");
            while (alphablend >= 0)
            {
                tabControl1.DrawToBitmap(myBitmap, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height));
                alphablend = alphablend - 10;               
                pictureBox1.Refresh();//this calls the paint action
            }
            pictureBox1.Visible = false;
        }
    
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics bitmapGraphics = Graphics.FromImage(myBitmap);
    
            SolidBrush greyBrush = new SolidBrush(Color.FromArgb(alphablend, 240, 240, 240));
    
            bitmapGraphics.CompositingMode = CompositingMode.SourceOver;
    
            bitmapGraphics.FillRectangle(greyBrush, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height));
    
            e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected;
    
            e.Graphics.DrawImage(myBitmap, 0, 0);
    
        }
    

    【讨论】:

      【解决方案3】:

      我没有看到 Winform/Webform 的规范,所以我假设 WebForm...

      您可以使用 AJAX AnimationExtender。

      如果做不到这一点,一个不好的方法(可行)是接受一个 QueryString 导致页面自动导航到您想要的选项卡,并使用页面转换。

      对于 Winforms,您可以使用 WPF :)

      【讨论】:

        【解决方案4】:

        我不相信 WPF TabControl 可以从一个 TabItem 淡入淡出到下一个,因为它不能同时显示多个 TabItem。

        您可以尝试通过将两个ListViews(一个用于标签条,一个用于面板)拼接在一起来模拟这一点,并将效果添加到后者的ControlTemplate。以 TabControl 和 ListView 的 ControlTemplates 为起点。

        【讨论】:

          【解决方案5】:

          根据您的选项卡/页面的工作方式,您可以通过向页面添加元标记来在页面级别处理它:

          <meta http-equiv="Page-Enter" content="blendTrans(Duration=0)">
          <meta http-equiv="Page-Exit" content="blendTrans(Duration=0)">
          

          只需更改持续时间以使淡入淡出更长或更短。这通常称为 FAJAX。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-06
            • 2010-10-26
            • 1970-01-01
            相关资源
            最近更新 更多