這個標題我也不知道咋起,意思說一下你就明白。 1. 對官方控制項的模板進行定製修改,以滿足多樣化需求,還有漂亮的UI 比如ListView,GridView等。 2. 在設計的情況下並沒有這個控制項,而在運行時的時候出現了它 比如微軟的廣告組件,他們叫AdControl,在運行時其實就是一個WebVie ...
這個標題我也不知道咋起,意思說一下你就明白。
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裡面寫的順序。