1. 程式人生 > >UWP 查找模板中的控件

UWP 查找模板中的控件

pen 完成 nta temp oot event mco inf res

原文:UWP 查找模板中的控件

這個標題我也不知道咋起,意思說一下你就明白。

1. 對官方控件的模板進行定制修改,以滿足多樣化需求,還有漂亮的UI

比如ListView,GridView等。

2. 在設計的情況下並沒有這個控件,而在運行時的時候出現了它

比如微軟的廣告組件,他們叫AdControl,在運行時其實就是一個WebView

下面看一下我的實際項目中的代碼,來舉例說明:

<FlipView x:Name="flipView" Background="{ThemeResource SystemControlChromeMediumAcrylicWindowMediumBrush }
">
<FlipView.ItemTemplate> <DataTemplate> <Grid> <Image x:Name="myImage" Grid.RowSpan="3" Stretch="Uniform" Source="{Binding img_realurl}" IsDoubleTapEnabled="True" DoubleTapped
="detailImage_DoubleTapped"/> <TextBlock Text="{Binding sitename}" Margin="3,0,0,0" VerticalAlignment="Center" Foreground="{ThemeResource SystemControlBackgroundAccentBrush}"/> </StackPanel> </Grid> </
DataTemplate> </FlipView.ItemTemplate> </FlipView>

我這個是定義的FlipView的模板,大家可以發現,裏面用到個Image控件,而這個控件,你如果直接定義他的x:Name的話,在後臺代碼.cs裏面使用myImage,是識別不到的。微軟不讓這麽用。

那麽怎麽辦,就是需要在運行時,通過代碼查找他,然後再操作即可。

查找的方法如下:

        public static T MyFindListBoxChildOfType<T>(DependencyObject root) where T : class
        {
            var MyQueue = new Queue<DependencyObject>();
            MyQueue.Enqueue(root);
            while (MyQueue.Count > 0)
            {
                DependencyObject current = MyQueue.Dequeue();
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
                {
                    var child = VisualTreeHelper.GetChild(current, i);
                    var typedChild = child as T;
                    if (typedChild != null)
                    {
                        return typedChild;
                    }
                    MyQueue.Enqueue(child);
                }
            }
            return null;
        }

然後在頁面加載完成的事件裏面使用,

private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            Image headImage = MyFindListBoxChildOfType<Image>(flipView);
            headImage.PointerEntered += Head_PointerEntered;
            headImage.PointerExited += Head_PointerExited;
        }

記下來就可以為所欲為的操作了。

技術分享圖片

有人說,我們的模板裏有多個Image控件,咋辦?

你將查找的函數改成返回List<T>即可,然後在Looaded裏面按順序取即可。

private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            Image detailImage = MyFindListBoxChildOfType<Image>(flipView)[0];
            Image headImage = MyFindListBoxChildOfType<Image>(flipView)[1];
        }

這個順序就是你在Xaml裏面寫的順序。

UWP 查找模板中的控件