複数のタブ ページを持つタブ コントロールがあります。タブを前後にフェードできるようにしたい。タブ コントロールに不透明度オプションが表示されません。あるタブ ページから別のタブ ページに切り替えるときにフェード効果を発生させる方法はありますか?
5 に答える
標準の Windows コントロールには魔法の Fade スイッチはありません。
タブのコンテンツをビットマップにダンプし ( 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を使用できます:)
WPF TabControl は、複数の TabItem を同時に表示する機能を備えていないため、1 つの TabItem から次の TabItem にフェードすることができるとは思いません。
これをエミュレートするには、2 つの をつなぎ合わせ(1 つはタブ ストリップ用、もう 1 つはパネル用) 、後者の にListView
効果を追加します。ControlTemplate
TabControl と ListView の ControlTemplates を出発点として使用します。
タブ/ページの動作方法によっては、ページにメタ タグを追加することで、ページ レベルで処理できる場合があります。
<meta http-equiv="Page-Enter" content="blendTrans(Duration=0)">
<meta http-equiv="Page-Exit" content="blendTrans(Duration=0)">
デュレーションを変更して、フェードを長くしたり短くしたりします。これは一般に FAJAX と呼ばれます。