Я решил опубликовать, что я сделал, чтобы мое решение работало. У GvS был самый близкий ответ, и он отправил меня в моем поиске в правильном направлении, поэтому я поставил ему (может быть, она, но давай) галочку правильного ответа, так как я не могу дать ее себе.
Я никогда не понимал, как «плавно переходить» с одной вкладки на другую (снижать непрозрачность на одной и увеличивать непрозрачность на другой), но я нашел ожидание, чтобы нарисовать серую рамку на растровом изображении с большим и большим количеством серого, придавая ей эффект исчезновения на моем фоне, который также серый. Затем я запускаю вторую вкладку как растровое изображение серого, которое постепенно добавляю меньше серого в сочетании с изображением вкладки на каждой итерации, придавая ей эффект исчезновения.
Это решение приводит к хорошему эффекту затухания (даже если я сам так говорю), но оно очень линейное. Я собираюсь немного поиграть с генератором случайных чисел для переменной alphablend и посмотреть, может ли это сделать ее менее линейной, но опять же пользователи могут оценить предсказуемость. Кстати, я запускаю событие вкладки переключателя нажатием кнопки.
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);
}