Установка свойства фона из раскадровки - PullRequest
1 голос
/ 22 ноября 2010

В проекте Windows Phone 7 я делаю цветную анимацию на фоне кнопок, меняя цвет в диапазоне.Я хочу, чтобы анимация остановилась при нажатии кнопки, и чтобы цвет фона кнопки оставался таким же, как и при нажатии.Для этого у меня есть следующий набор:

<Button Height="72" HorizontalAlignment="Left" 
    Margin="135,48,0,0" Name="button1" VerticalAlignment="Top" Width="160" 
    Click="button1_Click">
    <Button.Resources>
        <Storyboard x:Name="colorStoryboard">
        <!-- Animate the background color of the canvas from red to green over 4 seconds. -->
        <ColorAnimation BeginTime="00:00:00" Storyboard.TargetName="button1" 
            Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
            From="Red" To="Blue" Duration="0:0:4" />
        </Storyboard>
    </Button.Resources>
</Button>

Событие щелчка закодировано как:

private void button1_Click(object sender, RoutedEventArgs e)
{
    colorStoryboard.Pause();
    Brush holdBrush = new SolidColorBrush();
    holdBrush = button1.Background;
    colorStoryboard.Stop();
    button1.Background = holdBrush;
}

Вот как я думаю, это будет работать: после раскадровки. Пауза () останавливает любое дальнейшее изменение цвета (метод Stop заставляет кнопку вернуться к цвету фона по умолчанию), я сохраняю текущую кисть фона в новую Brush holdBrush, а затем после выполнения Stop () пытаюсь восстановитьсвойство background кнопки к значению, которое оно имело при возникновении Pause, используя holdBrush.

Однако это не то, что происходит.В приведенном выше коде я подтвердил, что у holdBrush есть цвет, который был у кнопки при приостановке раскадровки, но после остановки Stop, HoldBrush теперь имеет цвет по умолчанию - фактически, он имеет цвет #FFFFFF, который является цветом кнопкиберет на себя, когда он нажал.Любые идеи, кто-нибудь?

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

Анимация в Silverlight для Windows Phone запускается потоком Compositor, и вы просто создаете справочную копию объекта Background (поверхностная копия), и значение разделяется между потоком пользовательского интерфейса и потоком Compositor. Чтобы получить значение цвета, вам нужно получить значение DependencyProperty

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        colorStoryboard.Pause();
        var color = button1.Background.GetValue(SolidColorBrush.ColorProperty); 
        colorStoryboard.Stop();
        Dispatcher.BeginInvoke( () => button1.Background.SetValue(SolidColorBrush.ColorProperty,color)); 
    }

Но этот подход не самый лучший для Silverlight. Я бы изменил шаблон кнопки по умолчанию (Visual State).

0 голосов
/ 22 ноября 2010

Ваш текущий код просто берет ссылку на существующий объект и затем присваивает его обратно. Если бы вы проверяли цвет кисти до назначения кнопки, но после stop вы бы увидели, что ее цвет был сброшен. Это потому, что это такая же кисть, которая удерживается кнопкой.

Попробуйте вместо этого: -

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    colorStoryboard.Pause(); 
    SolidColorBrush brush = (SolidColorBrush)button1.Background; 
    Color holdColor = brush.Color;
    colorStoryboard.Stop(); 
    brush.Color = holdColor; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...