У меня есть элемент управления вкладками с несколькими страницами вкладок. Я хочу иметь возможность плавно переходить на вкладки вперед и назад. Я не вижу параметра непрозрачности на элементах управления вкладками. Есть ли способ вызвать эффект затухания при переключении с одной вкладки на другую?
winform - это не приложение wpf. Пока идея растрового изображения кажется лучшим планом





В стандартном элементе управления Windows нет волшебного переключателя Fade.
Вы можете выгрузить содержимое вкладки в растровое изображение (используя DrawToBitmap или CopyFromScreen?), Показать это растровое изображение перед TabControl, переключить вкладки, а затем затемнить растровое изображение.
Я не вижу спецификации Winform / Webform, поэтому предполагаю, что WebForm ...
Вы можете использовать AJAX AnimationExtender.
В противном случае плохой способ (который будет работать) - принять QueryString, который заставляет страницу автоматически переходить на нужную вкладку и использовать переходы страниц.
Для Winforms вы можете использовать WPF :)
В зависимости от того, как работают ваши вкладки / страница, вы можете справиться с этим на уровне страницы, добавив на страницу метатеги:
<meta http-equiv = "Page-Enter" content = "blendTrans(Duration=0)">
<meta http-equiv = "Page-Exit" content = "blendTrans(Duration=0)">
Просто измените продолжительность, чтобы затухание было длиннее или короче. Обычно это называется FAJAX.
Я не верю, что WPF TabControl можно заставить плавно переходить от одного элемента TabItem к другому, поскольку он не оборудован для одновременного отображения нескольких элементов TabItem.
Вы можете попытаться сымитировать это, сшив вместе два ListView (один для полосы вкладок и один для панели) и добавив эффект в ControlTemplate последнего. Используйте ControlTemplates для TabControl и ListView в качестве отправной точки.
Я решил опубликовать то, что я сделал, чтобы мое решение заработало. У 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);
}
Это приложение winforms или веб-приложение?