/// <summary> /// Called when IParallaxSource changes /// </summary> private void OnSourceChanged(View oldSource, View newSource) { if (m_parallaxSourceView != null) { m_parallaxSourceView.OffsetChanged -= OnSourceOffsetChanged; m_parallaxSourceView = null; } if (newSource is IParallaxSource) { m_parallaxSourceView = newSource as IParallaxSource; m_parallaxSourceView.OffsetChanged += OnSourceOffsetChanged; } else { m_parallaxSourceView = ParallaxLayout.FindParallaxSourceRecursive(newSource); if (m_parallaxSourceView != null) { m_parallaxSourceView.OffsetChanged += OnSourceOffsetChanged; } } if (m_parallaxSourceView != null) { OnSourceOffsetChanged(m_parallaxSourceView.HorizontalOffset, m_parallaxSourceView.VerticalOffset); } }
/// <summary> /// Called when source changes. If the source element is not a implementing IParallaxSource, the XAML tree is walked /// starting at the source element to find an embedded IParallaxSource element. /// </summary> private void OnSourceChanged(View oldSource, View newSource) { if (m_parallaxSourceView != null) { m_parallaxSourceView.OffsetChanged -= OnSourceOffsetChanged; } if (newSource is IParallaxSource) { m_parallaxSourceView = newSource as IParallaxSource; m_parallaxSourceView.OffsetChanged += OnSourceOffsetChanged; } else { m_parallaxSourceView = FindParallaxSourceRecursive(newSource); if (m_parallaxSourceView != null) { m_parallaxSourceView.OffsetChanged += OnSourceOffsetChanged; } } }
/// <summary> /// Find IParallaxSource child using recursion /// </summary> public static IParallaxSource FindParallaxSourceRecursive(View view) { if (view is IParallaxSource) { return(view as IParallaxSource); } else if (view is ILayoutController) { ILayoutController layout = view as ILayoutController; foreach (View child in layout.Children) { IParallaxSource source = FindParallaxSourceRecursive(child); if (source != null) { return(source); } } } return(null); }