2013-10-25 30 views
1

我想在視覺狀態變爲Flipped時更改HubTile的源代碼(圖像),但是我似乎無法從Windows Phone Toolkit中獲取可用於HubTile控件的VisualStateManager.GetVisualStateGroups。是否可以處理Windows Phone工具包HubTile的Visual State Changed事件?

我認爲,一旦我有VisualStateGroup,我可以然後處理CurrentStateChanged事件,但我似乎無法獲得該組。

我看到以下螺紋的不幸不包括代碼片段: -

Changing image source when Hubtile "resets"

我也曾嘗試使用VisualTreeHelper.GetChild,我並不需要考慮。

如果你能分享一些想法,我將不勝感激?基於以下博客文章

+0

這是相關的? http://connect.microsoft.com/VisualStudio/feedback/details/645074/visualstatemanager-getvisualstategroups-returns-empty-collection –

回答

0

: -

http://blogs.msdn.com/b/ptorr/archive/2010/07/23/how-to-detect-when-a-list-is-scrolling-or-not.aspx

我想出了以下內容: -

bool alreadyHookedEvents = false; 

    List<string> _images = new List<string>(); 
    int _index = 0; 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (_images.Count == 0) 
     { 
      _images.Add(@"\Images\1.jpg"); 
      _images.Add(@"\Images\2.jpg"); 
      _images.Add(@"\Images\3.jpg"); 
      _images.Add(@"\Images\4.jpg"); 
      _images.Add(@"\Images\5.jpg"); 
      _images.Add(@"\Images\6.jpg"); 
      _images.Add(@"\Images\7.jpg"); 
      _images.Add(@"\Images\8.jpg"); 
      _images.Add(@"\Images\9.jpg"); 
      _images.Add(@"\Images\10.jpg"); 
      _images.Add(@"\Images\11.jpg"); 
      _images.Add(@"\Images\12.jpg"); 
     } 

     if (alreadyHookedEvents) 
      return; 

     alreadyHookedEvents = true; 
     // Visual States are always on the first child of the control template 
     FrameworkElement element = VisualTreeHelper.GetChild(this.MyHubTile, 0) as FrameworkElement; 
     if (element != null) 
     { 
      VisualStateGroup group = FindVisualState(element, "ImageStates"); 
      if (group != null) 
      { 
       group.CurrentStateChanged += (s, args) => 
       { 
        if (group.CurrentState.Name == "Flipped") 
        { 
         _index++; 
         this.MyHubTile.Source = new BitmapImage(new Uri(_images[_index], UriKind.Relative)); 
        } 
       }; 
      } 
     } 
    } 

    VisualStateGroup FindVisualState(FrameworkElement element, string name) 
    { 
     if (element == null) 
      return null; 

     IList groups = VisualStateManager.GetVisualStateGroups(element); 
     foreach (VisualStateGroup group in groups) 
      if (group.Name == name) 
       return group; 

     return null; 
    } 

    T FindSimpleVisualChild<T>(DependencyObject element) where T : class 
    { 
     while (element != null) 
     { 

      if (element is T) 
       return element as T; 

      element = VisualTreeHelper.GetChild(element, 0); 
     } 

     return null; 
    } 
相關問題