2011-07-28 43 views
3

我想添加一個初始動畫,當項目添加到列表框。 對於這個我使用Layoutstates,通過融合的itemcontainerstyle內部產生:Silverlight佈局狀態前加載 - >後加載過渡只是不工作

<VisualStateGroup x:Name="LayoutStates"> 
    <VisualStateGroup.Transitions> 
     <VisualTransition GeneratedDuration="0:0:0.2"/> 
    </VisualStateGroup.Transitions> 
    <VisualState x:Name="AfterLoaded"/> 
    <VisualState x:Name="BeforeLoaded"> 
     <Storyboard> 
      <DoubleAnimation Duration="0" To="35" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="grid" d:IsOptimized="True"/> 
      <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid" d:IsOptimized="True"/> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="BeforeUnloaded"> 
     <Storyboard> 
      <DoubleAnimation Duration="0" To="0.85" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="grid" d:IsOptimized="True"/> 
      <DoubleAnimation Duration="0" To="0.85" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="grid" d:IsOptimized="True"/> 
      <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid" d:IsOptimized="True"/> 
     </Storyboard> 
    </VisualState> 
</VisualStateGroup> 

我的列表框看起來是這樣的:

<ListBox Grid.Row="1" ItemsSource="{Binding Days}" x:Name="Days" 
        HorizontalAlignment="Stretch" 
        SelectedItem="{Binding CurrentDay, Mode=TwoWay}" 
        ItemTemplate="{StaticResource TimeRecordByDayItemTemplate}" 
        ItemsPanel="{StaticResource ByMonthDaysItemsPanelTemplate}" 
        ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
        ItemContainerStyle="{StaticResource DayListBoxItemStyle}" /> 

我只是不明白,即使我只是服從任何動畫一步一步的channel9教程!

這是我的狀態管理員遇到的第一個問題,我也遇到了數據觸發器的問題,當遇到某些條件時,應該進入某個狀態,其中一些有效,一些沒有,但是我的所有綁定都是正確的! 此外,所有動畫都可以在Expression Blend預覽中使用。

我不能讓出了問題,我經常使用Silverlight和動畫在自己的環境中不工作(看這裏channel 9)最簡單的樣本複製了這個...

感謝你幫忙!

+0

我遇到的問題是我在viewmodels構造函數中創建了我的集合,在設置datacontext之前。佈局轉換thingy似乎只能識別列表上的操作,而不是列表屬性本身的更改。在這裏看到更多的細節:http://forums.silverlight.net/p/235377/581822.aspx/1?p=True&t=634480406085452885 –

回答

1

聽起來像你需要一個一個地加載項目,一旦一切都加載。似乎是一個簡單的解決辦法是在此您的視圖模型:

public class MyViewModel 
{ 
    private string[] _items; 
    private ObservableCollection<string> _itemCollection; 

    public MyViewModel() 
    { 
    // meets requirement of loading items in constructor 
    _items = { "Johnny", "Thommy", "Jay", "Wommy" }; 
    } 

    public ObservableCollection<string> Items 
    { 
    get 
    { 
     if (_itemCollection == null) 
     { 
      _itemCollection = new ObservableCollection<string>(); 
      Dispatcher.Invoke(() => LoadItems()); 
     } 
     return _itemCollection; 
    } 
    } 

    private void LoadItems() 
    { 
    foreach (var item in _items) 
    { 
     ItemCollection.Add(item); 
    } 
    } 
} 

基本上當列表框設置綁定你排隊的項目集合的增加。這應該在正確的時間加載項目,以便它們觸發您的動畫。

+0

嗯,這可能是一個解決方案,不太好,但也許適用於我的情況。我用創建動畫的自定義轉換控件部分地解決了這個問題,遺憾的是在卸載控件時不起作用,因爲停止了任何動畫(如何防止卸載直到動畫完成?) –