2010-11-22 124 views
1

在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> 

click事件被編碼爲:

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

這是我認爲這是可行的:在storyboard.Pause()停止任何進一步的後改變顏色(Stop方法導致按鈕返回到它的默認背景色),我將背景的當前畫筆保存到新的畫筆holdBrush中,然後在執行Stop()之後,我嘗試恢復按鈕的背景屬性到暫停發生時的值,使用holdBrush。

但是,這不是發生了什麼。在上面的代碼中,我已經確認holdBrush具有當故事板暫停時按鈕具有的顏色,但是在停止發生後,holdBrush現在具有默認顏色 - 實際上,它具有顏色#FFFFFF,該顏色是按鈕的顏色點擊時會發生。任何想法,任何人?

+0

我想停下來,保持顏色。 – Cyberherbalist 2010-11-22 05:32:57

回答

1

Silverlight for Windows Phone中的動畫由Compositor Thread運行,您所做的只是Background對象(淺拷貝)的參考副本,並且該值在UI Thread和Compositor Thread之間共享。爲了獲得色彩的價值,你需要得到一個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

您當前的代碼僅僅是對現有對象進行引用,然後將其分配回來。如果您要檢查之前指定給該按鈕的顏色,但在停止之後,您會看到其顏色重置。那是因爲它是由相同刷按鈕所持有的那樣。

試試這個: -

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    colorStoryboard.Pause(); 
    SolidColorBrush brush = (SolidColorBrush)button1.Background; 
    Color holdColor = brush.Color; 
    colorStoryboard.Stop(); 
    brush.Color = holdColor; 
}