質問

複数のタブページを持つタブコントロールがあります。タブを前後にフェードできるようにしたい。タブコントロールに不透明度オプションが表示されません。あるタブページから別のタブページに切り替えるときにフェード効果を引き起こす方法はありますか?

役に立ちましたか?

解決

標準のWindowsコントロールには魔法のフェードスイッチはありません。

タブのコンテンツをビットマップにダンプできます( DrawToBitmap または CopyFromScreen ?)、そのビットマップをTabControlの前に表示し、タブを切り替えて、ビットマップをフェードします。

他のヒント

ソリューションを機能させるために行ったことを投稿することにしました。 GvSが最も近い答えを持っていて、正しい方向に自分のクエストを送ってくれたので、私は彼に正解チェックマークを付けました(彼女になるかもしれませんが、自分にそれを与えることはできません)。 「クロスフェード」の方法がわからなかったあるタブから別のタブに移動します(一方の不透明度を下げ、もう一方の不透明度を上げます)が、ビットマップ上に灰色のボックスをペイントし、灰色になっている背景にフェードする効果を与えるのを待つのを見つけました。次に、2番目のタブをグレーのビットマップとして開始し、繰り返しごとにタブ画像と組み合わせてグレーを少しずつ追加して、フェードアップ効果を与えます。

このソリューションは、(私がそう言っても)素晴らしいフェード効果をもたらしますが、非常に線形です。 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);

    }

Winform / Webformの仕様が表示されないため、WebFormを想定します...

AJAX AnimationExtenderを使用できます。

これに失敗すると、(動作する)悪い方法は、ページが目的のタブに自動的に移動するQueryStringを受け入れ、ページ遷移を使用することです。

Winformsの場合、WPFを使用できます:)

複数のTabItemを同時に表示する機能がないため、WPF TabControlをあるTabItemから次のTabItemにフェードさせることができるとは思わない。

2つの ListView (1つはタブストリップ用、もう1つはパネル用)をつなぎ合わせてこれをエミュレートし、エフェクトを ControlTemplate に追加してみてください。後者。開始点としてTabControlとListViewのControlTemplatesを使用します。

タブ/ページの動作方法によっては、ページにメタタグを追加することでページレベルで処理できる場合があります。

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

持続時間を変更するだけで、フェードを長くしたり短くしたりできます。これは一般にFAJAXと呼ばれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top