1

We have a Windows phone application, where we have DataTemplate inside Page.Resource. Below is the xaml :

    <PhoneApplicationPage
<PhoneApplicationPage.Resources>
<DataTemplate>
<ScrollViewer> // We want to fetch this control inside DataTemplate
..
</ScrollViewer>
</DataTemplate>
</PhoneApplicationPage.Resources>

<Grid Name="LayoutRoot">
<ItemsControl ItemTemplate={StatisSource DataTemplate}>
</ItemsControl>
</Grid>

</PhoneApplicationPage

So far we have used Visual Tree helper and iterate to find child control inside it. Below is the helper snippet we are using :

public T FindChild<T>(DependencyObject parent, string childName)
where T : DependencyObject
    {
        // Confirm parent and childName are valid. 
        if (parent == null) return null;

        T foundChild = null;

        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            // If the child is not of the request child type child
            T childType = child as T;
            if (childType == null)
            {
                // recursively drill down the tree
                foundChild = FindChild<T>(child, childName);

                // If the child is found, break so we do not overwrite the found child. 
                if (foundChild != null) break;
            }
            else if (!string.IsNullOrEmpty(childName))
            {
                var frameworkElement = child as FrameworkElement;
                // If the child's name is set for search
                if (frameworkElement != null && frameworkElement.Name == childName)
                {
                    // if the child's name is of the request name
                    foundChild = (T)child;
                    break;
                }
            }
            else
            {
                // child element found.
                foundChild = (T)child;
                break;
            }
        }

        return foundChild;
    }

and calling above function as :

                ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer;

But scrollViewer object always have null value. We are unable to fetch expected control inside datatemplate. Any suggestion ?

Thanks.

1 Answer 1

0

1 Don't provide a control name to your function

Change :

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer;

I don't see any control named AdSlider in your sample.

Into :

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) , null);

2 provide a name to your DataTemplate

Change :

<DataTemplate>

Into :

<DataTemplate x:Key="dataTemplate1">

3 Please also correct

<ItemsControl ItemTemplate={StatisSource dataTemplate1}>

into:

<ItemsControl ItemTemplate={StaticSource dataTemplate1}>
5
  • Thanks for your feedback Durin. But after doing all you suggested, FindChild method returns an exception 'reference is not a valid visual dependencyobject' because it wont accepting parameter as DataTemplate. So we tried another method as : ((this.View.FindName("AdvertSlider") as SlideViewExtended).ItemTemplate.LoadContent() as ScrollViewer). But this method create a same copy of UI elements and doesn't help us to manipulate scrolling behaviour of ScrollViewer. Commented Jun 23, 2016 at 17:57
  • I corrected some errors that seemed obvious to me. But after looking back I am not sure to understand what you re searching for. I also corrected point2 where code was not visible Commented Jun 23, 2016 at 20:36
  • We are trying to find scrollviewer inside datatemplate of Itemscontrol and our task is to scroll that scrollviewer after. Commented Jun 24, 2016 at 5:52
  • In what event (Button.Click, ...) do you want to find the ScrollViewer ? Commented Jun 24, 2016 at 7:22
  • Thanks Durin for your feedback. But we somehow managed to scroll our scrollviewer by using attached properties. We did bind a attached vertical offset property found here : blog.scottlogic.com/2010/07/21/… Commented Jun 24, 2016 at 7:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.