原文: 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裡面寫的順序。