2015-05-27 50 views
0

我幾乎可以將整個問題都融入到問題主題中,但有趣的部分並不適合。所以上面問題的棘手部分是這樣的:綁定動畫屬性以點擊ItemsControl內的可視項目

我的動畫不適用於點擊的可視化子元素,而是應用到構成可視子元素的ItemsControl的父容器。 所以我的問題是爲數據綁定找到適當的「源」。

但是首先一些XAML: 這就是我想申請(裏面一個Storyboard資源)動畫:

<DoubleAnimation 
       Storyboard.Target="{x:Reference ItemsControlGrid}" 
       Storyboard.TargetProperty="(Canvas.Left)" 
       From="0" To="{Binding Source=Tile, Path=Width}"/> 

有問題的部分是動畫的「」物權。 (忽略Path = Width,它只是一個我知道存在於綁定源的測試屬性)。 如果我使用硬編碼值,它已經可以工作。

「瓷磚」是我想要綁定到的DataTemplate控件的名稱。

它看起來像這樣:

<DataTemplate DataType="{x:Type local:Task}"> 
     <Grid x:Name="Tile" MouseDown="Task_OnClick" MinWidth="200" Background="{StaticResource TileBackground}" Margin="7" RenderTransformOrigin="0.5,0.5" > 
      <Grid.Triggers> 
       <EventTrigger RoutedEvent="Grid.MouseDown"> 
        <BeginStoryboard Storyboard="{StaticResource AnimLeave}"></BeginStoryboard> 
       </EventTrigger> 
      </Grid.Triggers> 
...content 
     </Grid> 
    </DataTemplate> 

ItemsControl的構成是這樣的:

<ScrollViewer> 
    <Canvas> 
     <Grid x:Name="ItemsControlGrid"> 
     <ItemsControl x:Name="Taskboard" > 
      <ItemsControl.ItemsSource> 
       <CompositeCollection> 
        <CollectionContainer Collection="{Binding Tasks, Source={x:Static ...secret}}"/> 
        <Button> 
        </Button> 
       </CompositeCollection> 
      </ItemsControl.ItemsSource> 

據我所知,WPF這不起作用,因爲動畫應用到的父ItemsControl對動畫發起者(視覺小孩「瓷磚」)的「綁定上下文」完全丟失。

所以要summerize我最終想達到的目標:

我想動畫的「磚」項目,當我點擊它順利填滿整個可見ScrollViewer中。我嘗試通過同時調整Tile的大小,同時以某種方式移動父網格來實現該效果,即該tile的中心移動到scrollviewers中心。

總之:我要點擊「平鋪」順利打通到瓷磚的「詳細信息」查看(顯示完全不同的內容)

即使有一個完全不同的/更好的辦法來解決我的真實問題我仍然想知道如何完成數據綁定。

在此先感謝。我肯定會從希望即將到來的答案中再次學習。

回答

0

問題是故事板是一個資源。當我聲明它的裏面的DataTemplate我可以使用

<DoubleAnimation 
    Storyboard.Target="{x:Reference ItemsControlGrid}" 
    Storyboard.TargetProperty="(Canvas.Top)" 
    Duration="{StaticResource ZoomInTime}" BeginTime="{StaticResource FadeOutTime}" 
    From="0" To="{Binding ElementName=Tile, TargetNullValue=0, Path=Tag.(Point.Y)}"> 

甲棘手的部分是「路徑=標籤。(Point.Y)」。我用我的瓷磚的標記來存儲我的代碼背後的計算這樣的目標位置:

var tile = ((Grid) sender); 
GeneralTransform transform = tile.TransformToAncestor(CanvasTaskboard); 
tile.Tag = transform.Inverse.Transform(new Point((CanvasTaskboard.ActualWidth - tile.ActualWidth)/2, (CanvasTaskboard.ActualHeight - tile.ActualHeight)/2)); 

工作得很好。動畫看起來很棒。

更新: 我應該提到,也可以通過名稱在Tile上「查找」動畫並直接在代碼後面設置「To」屬性。

相關問題