经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
UWP 查找模板中的控件
来源:cnblogs  作者:星期八再娶你  时间:2018/9/25 20:41:31  对本文有异议

这个标题我也不知道咋起,意思说一下你就明白。

1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI

比如ListView,GridView等。

2. 在设计的情况下并没有这个控件,而在运行时的时候出现了它

比如微软的广告组件,他们叫AdControl,在运行时其实就是一个WebView

 

下面看一下我的实际项目中的代码,来举例说明:

  1. <FlipView x:Name="flipView" Background="{ThemeResource SystemControlChromeMediumAcrylicWindowMediumBrush }">
    <FlipView.ItemTemplate>
  2. <DataTemplate>
  3. <Grid>
  4. <Image x:Name="myImage" Grid.RowSpan="3" Stretch="Uniform"
  5. Source="{Binding img_realurl}" IsDoubleTapEnabled="True"
  6. DoubleTapped="detailImage_DoubleTapped"/>
  7.  
  8. <TextBlock Text="{Binding sitename}" Margin="3,0,0,0" VerticalAlignment="Center" Foreground="{ThemeResource SystemControlBackgroundAccentBrush}"/>
  9. </StackPanel>
  10. </Grid>
  11. </DataTemplate>
  12. </FlipView.ItemTemplate>
  13. </FlipView>

 

 

我这个是定义的FlipView的模板,大家可以发现,里面用到个Image控件,而这个控件,你如果直接定义他的x:Name的话,在后台代码.cs里面使用myImage,是识别不到的。微软不让这么用。

那么怎么办,就是需要在运行时,通过代码查找他,然后再操作即可。

 

查找的方法如下:

  1. public static T MyFindListBoxChildOfType<T>(DependencyObject root) where T : class
  2. {
  3. var MyQueue = new Queue<DependencyObject>();
  4. MyQueue.Enqueue(root);
  5. while (MyQueue.Count > 0)
  6. {
  7. DependencyObject current = MyQueue.Dequeue();
  8. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)
  9. {
  10. var child = VisualTreeHelper.GetChild(current, i);
  11. var typedChild = child as T;
  12. if (typedChild != null)
  13. {
  14. return typedChild;
  15. }
  16. MyQueue.Enqueue(child);
  17. }
  18. }
  19. return null;
  20. }

 

 

然后在页面加载完成的事件里面使用,

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

 

记下来就可以为所欲为的操作了。

 

 

有人说,我们的模板里有多个Image控件,咋办?

你将查找的函数改成返回List<T>即可,然后在Looaded里面按顺序取即可。

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

 

这个顺序就是你在Xaml里面写的顺序。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号