2013-09-27 133 views
0

目前,我正在做一些實驗。我目前的情況:我有一個StoryBoard在兩個UserControl之間轉換(例如,縮小當前的UserControl然後增長另一個)。WPF將UserControl綁定到資源

我想要做的是將2個用戶控件定義爲XAML的一部分,並帶有「當前」和「下一個」鍵。 Current應該綁定到當前查看的UserControl。在轉換之前,下一個應該被綁定,所以StoryBoard知道要轉換到哪個元素。這裏是我卡住的地方:完全使用XAML,人們會怎麼做呢?

我有一個簡單的故事板是ItemsControl的的資源,以及兩個用戶控件項目:

<ItemsControl.Resources> 
    <Storyboard x:Key="TransitionStoryboard"> 
    <!-- Shrink this one. --> 
    <DoubleAnimation Storyboard.Target="{Binding Current}" Storyboard.TargetProperty="Width" To="0" Duration="0:0:1"/> 
    <!--Grow the next.--> 
    <DoubleAnimation Storyboard.Target="{Binding Next}" Storyboard.TargetProperty="Width" To="100" BeginTime="0:0:1" Duration="0:0:1"/> 
    </Storyboard> 

    <UserControl x:Key="Current"/> 
    <UserControl x:Key="Next" Width="0"/> 
</ItemsControl.Resources> 

所以,當我定義屬於ItemsControl的(像這樣)一個新的用戶控件:

<my:Control1 x:Name="ControlOne"/> 

如何將「當前」UserControl設置爲ControlOne?然後,當我想要轉換時,我如何將其中一個設置爲「下一個」?如何在觸發後更改這些設置?

謝謝

回答

2

這是一團糟。您似乎完全誤解了靜態資源的使用方式。

要實現你正在嘗試做的事,你應該首先決定什麼會觸發動畫。理想情況下,您的控件應該是DependencyProperty,或者您的視圖模型上的屬性(實現INotifyPropertyChanged)。例如,您可以聲明一個IsSelected屬性。然後,您應該創建一個樣式,當控件被選中時觸發「增長」動畫,並在控件失去選擇時觸發「縮小」動畫。 例如:

<Style TargetType="Control" x:Key="FancyStyle"> 
    <Style.Triggers> 
     <DataTrigger Binding={Binding IsSelected} Value="True"> 
      <DataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource YourGrowAnim}"/> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource YourShrinkAnim}"/> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

那你應該是風格分配給每一個控制,你要動畫這種方式,併成立過渡性質IsSelected之間。您也可以使用EventTrigger,並將動畫綁定到事件(例如,當控件獲得/失去焦點時,您可以觸發這些動畫)。

你也應該修復你的「成長」動畫,它不會工作,最有可能的。

+0

這是一個很好的答案,謝謝。它以完全不同的方式實現了我想要做的事情。 至於你的第一個幾句話 - 哎唷!是的,我承認你是對的。你知道WPF的好資源嗎?我發現他們中的大多數缺乏凝聚力,或者他們解釋瞭如何做而不解釋它爲什麼起作用。 – MrShoes

+0

@MrShoes,http://www.amazon.com/Pro-WPF-4-5-Presentation-Foundation/dp/1430243651 :) –