Анимации: элементы управления Sliding & Fading в форме C # (winforms) - PullRequest
15 голосов
/ 27 мая 2010

Я пытаюсь реализовать способ элегантно анимировать (переводить, затухать) элементы управления вокруг (возможно, более одного одновременно). Например, предположим, что у меня была картинка в верхнем левом углу и текстовое поле в нижнем правом углу, я бы хотел, чтобы они плавно скользили по окну и менялись местами. Я работал некоторое время, но не смог придумать ничего, что могло бы достичь этого легко или просто.

Ответы [ 5 ]

20 голосов
/ 27 мая 2010

Ознакомьтесь с проектом dot-net-transitions в Google Code. Теперь есть клон на Github. Он также доступен на nuget как dot-net-transitions. Он поддерживает множество линейных / нелинейных переходов, включая составные переходы, которые можно использовать для более сложных эффектов, таких как пульсация.

Вот рабочий пример, демонстрирующий желаемое поведение:

var pictureBox = new PictureBox
    {
        ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png",
        SizeMode = PictureBoxSizeMode.AutoSize
    };
var textBox = new TextBox
    {
        Text = "Hello World",
        Location = new Point(140, 140)
    };
var form = new Form
    {
        Controls =
        {
            textBox,
            pictureBox
        }
    };
form.Click += (sender, e) =>
    {
        // swap the Left and Top properties using a transition
        var t = new Transition(new TransitionType_EaseInEaseOut(1000));
        t.add(pictureBox, "Left", textBox.Left);
        t.add(pictureBox, "Top", textBox.Top);
        t.add(textBox, "Left", pictureBox.Left);
        t.add(textBox, "Top", pictureBox.Top);
        t.run();
    };
form.ShowDialog();
8 голосов
/ 27 мая 2010

Я рекомендую вам перейти на WPF; это сделало бы это намного проще.

Абсолютно невозможно исчезнуть элементы управления в WinForms; Элементы управления Windows не могут иметь прозрачность.
Самое близкое, что вы можете получить, - визуализировать элемент управления и его область в форме с парой растровых изображений, а затем перекрасить растровые изображения в PictureBox с помощью ColorMatrix.

Чтобы перемещать элементы управления в WinForms, вы можете использовать таймер для постепенного изменения свойств элементов управления Top и / или Left и перемещения их по форме. Тем не менее, вы получите раздражающее мерцание, которое (AFAIK) невозможно удалить.

2 голосов
/ 27 мая 2010

Вы могли бы сделать это в WinForms, приложив немало усилий, поэтому мне придется повторить рекомендации по использованию WPF (который по сути создан именно для такого рода вещей).

Вашим главным препятствием для этого в WinForms является тот факт, что местоположение элемента управления задается целым числом, что означает, что вы не можете, например, установить для свойства Left элемента управления значение 45.3425. Это в основном делает плавную анимацию элементов управления (при условии, что вы хотите движение, изменяющее скорости и направления) совершенно невозможной - таким образом вы получите неизбежный рывок движения (я пробовал, насколько я знаю).

Как предложил SLaks, единственный способ сделать это в WinForms - это "подделать" его, сделав "снимки" каждого элемента управления. По сути, вы бы начали с невидимого растрового изображения размером с форму, нарисованного с помощью BackColor формы. Затем вы должны создать «снимки», вызывая DrawToBitmap () для каждого элемента управления, который хотите анимировать, и создать эффект движения, рисуя снимки на холсте (System.Drawing может рисовать изображения с координатами с плавающей точкой, избегая рывков целые местоположения).

Хотя это чересчур много. Просто используйте WPF. :)

Редактировать: Я должен упомянуть, что на самом деле просто сделать что-то подобное в WinForms, если вы не возражаете, если вы выглядите ужасно, вяло и любительски. Мои комментарии выше касаются трудностей, связанных с этим хорошо .

0 голосов
/ 19 января 2013

Я считаю, что этот ответ использования встроенного AnimateWindow намного лучше для этой цели: Как я могу добавить движущиеся эффекты к своим элементам управления в C #?

0 голосов
/ 27 мая 2010

Сохранить копию значений x и y каждого элемента в виде числа с плавающей запятой.

Используйте таймер, и при каждом тике добавляйте значение в верхнюю левую позицию элемента x и y. Вычтите то же значение из нижнего правого элемента x и y.

Убедитесь, что вы используете здесь кэшированные значения с плавающей запятой, в противном случае вы можете получить ошибки округления при перемещении элемента в форме.

Если вы рисуете на любой поверхности, которую используете для изображений / элементов управления, аннулируйте ее для каждого тика.

Должно быть легко-peasy.

Edit:

Для прозрачных элементов управления ознакомьтесь с советами и рекомендациями Боба Пауэлла:

http://www.bobpowell.net/transcontrols.htm

А вот его собственный ответ о том, как сделать полупрозрачные элементы управления:

http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

...