Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VisualBrush as animation frame 
V
    Опции темы
Freak_FB
  Дата 13.12.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: нет
Всего: 4



От нечего делать и в порядке самообразования делаю хитрый стиль для ProgressBar по мотивам Nyan Cat.

Пока что застопорился на том, что не могу использовать VisualBrush в качестве фрейма в анимации.
Есть две кисти, определяющие два фоновых рисунка:

Код

<VisualBrush x:Key="NyanWeavingStripesForeground" TileMode="Tile" AlignmentX="Left" ViewportUnits="Absolute">
    <VisualBrush.Viewport>
        <Rect X="0" Y="0" Width="50" Height="50" />
    </VisualBrush.Viewport>
    <VisualBrush.Visual>
        <Canvas Width="2" Height="25">
            <Rectangle Canvas.Left="0" Canvas.Top="0" Width="1" Height="4" Fill="Red" />
            <Rectangle Canvas.Left="0" Canvas.Top="4" Width="1" Height="4" Fill="Orange" />
            <Rectangle Canvas.Left="0" Canvas.Top="8" Width="1" Height="4" Fill="Yellow" />
            <Rectangle Canvas.Left="0" Canvas.Top="12" Width="1" Height="4" Fill="#FF33FF00" />
            <Rectangle Canvas.Left="0" Canvas.Top="16" Width="1" Height="4" Fill="#FF0099FF" />
            <Rectangle Canvas.Left="0" Canvas.Top="20" Width="1" Height="4" Fill="#FF6633FF" />

            <Rectangle Canvas.Left="1" Canvas.Top="1" Width="1" Height="4" Fill="Red" />
            <Rectangle Canvas.Left="1" Canvas.Top="5" Width="1" Height="4" Fill="Orange" />
            <Rectangle Canvas.Left="1" Canvas.Top="9" Width="1" Height="4" Fill="Yellow" />
            <Rectangle Canvas.Left="1" Canvas.Top="13" Width="1" Height="4" Fill="#FF33FF00" />
            <Rectangle Canvas.Left="1" Canvas.Top="17" Width="1" Height="4" Fill="#FF0099FF" />
            <Rectangle Canvas.Left="1" Canvas.Top="21" Width="1" Height="4" Fill="#FF6633FF" />
        </Canvas>
    </VisualBrush.Visual>
</VisualBrush>
<VisualBrush x:Key="NyanWeavingStripesForegroundAlt" TileMode="Tile" AlignmentX="Left" ViewportUnits="Absolute">
    <VisualBrush.Viewport>
        <Rect X="0" Y="0" Width="50" Height="50" />
    </VisualBrush.Viewport>
    <VisualBrush.Visual>
        <Canvas Width="2" Height="25">
            <Rectangle Canvas.Left="1" Canvas.Top="0" Width="1" Height="4" Fill="Red" />
            <Rectangle Canvas.Left="1" Canvas.Top="4" Width="1" Height="4" Fill="Orange" />
            <Rectangle Canvas.Left="1" Canvas.Top="8" Width="1" Height="4" Fill="Yellow" />
            <Rectangle Canvas.Left="1" Canvas.Top="12" Width="1" Height="4" Fill="#FF33FF00" />
            <Rectangle Canvas.Left="1" Canvas.Top="16" Width="1" Height="4" Fill="#FF0099FF" />
            <Rectangle Canvas.Left="1" Canvas.Top="20" Width="1" Height="4" Fill="#FF6633FF" />

            <Rectangle Canvas.Left="0" Canvas.Top="1" Width="1" Height="4" Fill="Red" />
            <Rectangle Canvas.Left="0" Canvas.Top="5" Width="1" Height="4" Fill="Orange" />
            <Rectangle Canvas.Left="0" Canvas.Top="9" Width="1" Height="4" Fill="Yellow" />
            <Rectangle Canvas.Left="0" Canvas.Top="13" Width="1" Height="4" Fill="#FF33FF00" />
            <Rectangle Canvas.Left="0" Canvas.Top="17" Width="1" Height="4" Fill="#FF0099FF" />
            <Rectangle Canvas.Left="0" Canvas.Top="21" Width="1" Height="4" Fill="#FF6633FF" />
        </Canvas>
    </VisualBrush.Visual>
</VisualBrush>


Затем, есть стиль для элемента Rectangle, который по триггеру (фактически - с самого начала) начнет анимировать эти два фоновых рисунка:

Код

<Style x:Key="WeavingStripesStyle" TargetType="Rectangle">
    <Style.Resources>
        <Storyboard x:Key="WeavingStripesAnimation">
            <ObjectAnimationUsingKeyFrames Duration="0:0:0.5" Storyboard.TargetProperty="Fill" RepeatBehavior="Forever">
                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{StaticResource NyanWeavingStripesForeground}" />
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{StaticResource NyanWeavingStripesForegroundAlt}" />
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="IsVisible" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard x:Name="WeavingStripesStoryboard" Storyboard="{StaticResource WeavingStripesAnimation}" />
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="WeavingStripesStoryboard" />
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>


Ну и, собственно, сам прямоугольник где этот фон должен выводиться:

Код

<Rectangle Height="50" SnapsToDevicePixels="True" Style="{StaticResource WeavingStripesStyle}" />


Вылетает Exception где-то на этапе запуска:
Код

"Задание свойства "System.Windows.FrameworkElement.Style" вызвало исключение.": номер строки "237" и позиция в строке "14".
Не удается зафиксировать данное дерево шкалы времени Storyboard для использования в различных потоках.
(Cannot freeze this Storyboard timeline tree for use across threads)


Если использовать вместо VisualBrush SolidColorBrush - всё работает.
В чём может быть проблема?

Поправка 1: Похоже, проблема из за того что c VisualBrush нельзя сделать Freeze(). Может есть идеи как это обойти? Не очень хочется использовать битмапы.

Это сообщение отредактировал(а) Freak_FB - 13.12.2011, 22:36


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
Gvozdin
Дата 13.12.2011, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Ну тут дело в том что у VisualBrush хотят дернуть Freeze(), а это невозможно по самой сути VisualBrush.

Вот немного об этом:
http://social.msdn.microsoft.com/Forums/en...77-d65aa65723bf

Вообще мне кажется что VisualBrush задумывался немного не для этого smile
Типа там отражение сделать для контрола, это вот для него, а рисовать через него таким образом это не то.

Если уж что-то рисуете на XAML, используйте Drawing и DrawingBrush.
Особенно я думаю хорошо будет использовать Expression Design.

Или уж если очень хочется рисовать через Rectangle, то можно в коде делать из них ImageBrush.

Если уж вы занимаетесь этим просто так для себя, вот может быть интересным и полезным smile
http://blogs.msdn.com/b/kaelr/archive/2008...napshooter.aspx
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Freak_FB
Дата 14.12.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: нет
Всего: 4



Да, DrawingBrush из головы вылетел совсем. Переписал с использованием его, двигаюсь дальше.
Спасибо за помощь  smile 



--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.