2012-06-14 54 views
5

我已經遍尋搜索,似乎無法找到有關此問題的答案。我的應用程序生活在鬆散XAML的世界中,因此必須依靠XamlReaders和樹狀漫步來查找元素。我有一個處理這些XAML頁面呈現的組件。該渲染器需要知道可以在加載的XAML上運行的故事板狀態。所以我想在我的渲染器中做的是這樣的: -故事板上的GetCurrentState在XAML中定義和啓動

var resources = _currentScreenFrameworkElement.Resources; 
foreach (var item in resources.Values) 
{ 
    if (item is Storyboard) 
    { 
     try 
     { 
      var storyboard = item as Storyboard; 
      **if (storyboard.GetCurrentState() == ClockState.Active)** 

一切都很好,很好。然而問題是,當我嘗試了D確認它拋出一個異常在currentState: -

"Cannot perform action because the specified Storyboard was not applied to this object for interactive control." 

環顧我看到它的,因爲我需要做的故事板可控。所以我的問題是如何在XAML中執行此操作?我不會在代碼中啓動故事板,因此無法傳遞到超載的BeginStoryboard。

回答

5

我剛碰到同樣的問題,所以我想我會分享我的發現。

當您的故事板未標記爲可控時,會出現該錯誤。當Begin方法被調用時,故事板被標記爲可控。

如果你是從後面的代碼做的話,那麼你只需使用具有這個IsControllable布爾參數(list of Begin overloads)的重載。

如果您在Xaml中使用了BeginAnimation元素,那麼您需要做2件事情。

  1. Name分配給BeginAnimation元素。該屬性的documentation指出:「如果未指定BeginStoryboard的名稱,故事板在開始後不能受到交互式影響」
  2. 當您試圖在代碼隱藏中與故事板進行交互時,您必須將引用傳遞給您BeginStoryboard在聲明的對象。

這裏是你展示步驟1的例子(命名beginstoryboard)

<Button Name="btn1" Content="bla"> 
    <Button.Triggers> 
    <EventTrigger RoutedEvent="Button.Click"> 
     <BeginStoryboard 
      Name="bnt1_beginStoryboard" 
      Storyboard={StaticResource someSharedStoryboard}"/> 
    </EventTrigger> 
    </Button.Triggers> 
</Button> 

,這裏是因爲你命名你的beginStoryboard你可以爲第2步中的例子用它作爲你的類的局部變量..或者你可以直接參考實際故事板。主要的一點是,你必須在beginStoryboard的所有者通過(在這種情況下,該按鈕)

//The main point here is that we're passing in btn1 
bnt1_beginStoryboard.Storyboard.Stop(btn1); 
bnt1_beginStoryboard.Storyboard.SkipToFill(btn1); 
bnt1_beginStoryboard.Storyboard.Resume(btn1); 

這裏有一個情節串連圖板所有的「動作」的方法需要你在傳遞一個列表擁有框架元素:Control a Storyboard After It Starts