Dino Windows 8 学习笔记(八)--How to find a control in a DataTemplate

Dino Windows 8 学习笔记(八)--How to find a control in a DataTemplate

      看来没有承接上第七章,有点失败了。还没来得及研究GridView,先把期间遇到的问题的解决方案提出来,列在这个地方,以飨读者。
      很多时候,我们都在使用DataTemplate来进行代码的重用,有些在DataTemplate中的控件,你是不能直接在Code中使用的,他们被DataTemplate围了起来,我们直接看不到。但是有些情况下,我们有需要在代码中对这些控件进行相应的操作。怎么办呢?
      微软官方给了一个task,就是如何在生成的DataTemplate中查找控件,分为C#版本和VB版本。这两种版本的控件都有Template属性,而且Template属性中也有FindName这个方法,可以很方便地找到相应的控件。但是C++就没那么幸运了。为了实现在C++ XAML中的DataTemplate中找到相应的控件,我查了一下微软的论坛,也有人在问这个问题,答案是现成的,我先摘抄在这个地方,以后肯定会用到的。

http://msdn.microsoft.com/en-us/library/bb613579.aspx

问题的提出:
      ListBox中有一个ItemTemplate,ItemTemplate中又有一个


1  < ListBox  Name ="myListBox"  ItemTemplate ="{StaticResource myDataTemplate}"
2           IsSynchronizedWithCurrentItem ="True" >
3     < ListBox .ItemsSource >
4       < Binding  Source ="{StaticResource InventoryData}"  XPath ="Books/Book" />
5     </ ListBox.ItemsSource >
6  </ ListBox >
7 

要找到textBlock这个控件:

1  < DataTemplate  x:Key ="myDataTemplate" >
2     < TextBlock  Name ="textBlock"  FontSize ="14"  Foreground ="Blue" >
3       < TextBlock .Text >
4         < Binding  XPath ="Title" />
5       </ TextBlock.Text >
6     </ TextBlock >
7  </ DataTemplate >
8 


C++方法:
 1  Windows::UI::Xaml::FrameworkElement ^  ItemDetailPage::FindVisualChildByName(DependencyObject ^  obj, String ^  name)
 2  {
 3      FrameworkElement ^  ret ;
 4       int  numChildren  =  VisualTreeHelper::GetChildrenCount(obj);
 5        for  ( int  i  =   0 ; i  <  numChildren; i ++ )
 6          {
 7              auto objChild  =  VisualTreeHelper::GetChild(obj, i);
 8              auto child  =  safe_cast < FrameworkElement ^> (objChild);
 9               if  (child  !=  nullptr  &&  child -> Name  ==  name)
10              {
11                   return  child;
12              }
13 
14              ret  =  FindVisualChildByName(objChild, name);
15               if  (ret  !=  nullptr)
16                   break ;
17          }
18      return  ret;
19  }

这个方法是个递归,一层一层地找有没有这个控件,找到就返回。
看来所有的控件,只要有名字的都是放在VisualTree里面的。


使用方法:

1  auto element  =  safe_cast < TextBlock ^> (FindVisualChildByName(myListBox, " textBlock " ));

随便记录一下如何排序,比较简单,原来没怎么接触过STL,现在多熟悉熟悉。
排序:

1  auto selectedItem  =  safe_cast < Data::DataItem ^> (flipView -> SelectedItem);
2          auto collection  =  selectedItem -> DailyTasks;
3          std::sort(begin(collection),end(collection),[ = ](Data::DailyTask ^  left,Data::DailyTask ^  right)
4          {
5               return  left -> LevelOfTask  <  right -> LevelOfTask;
6          });


下章提示:
      如何选择一个图片,并显示在控件上面。这里牵涉到微软的安全策略,微软现在做得像苹果一样,把所有的东西都打包进一个沙箱里面,允许你操作的范围就在这个包里面,有些东西你直接是不能操作的,比如,如果你知道了一个图片的路径:"E:\\Dino\\pic.png",然后使用类似的方法:auto bitmap = ref new Bitmap(ref new Uri("E:\\Dino\\pic.png")); Image^ image = ref new Image(); image->Source = bitmap; 这样是不行滴。

你可能感兴趣的:(Dino Windows 8 学习笔记(八)--How to find a control in a DataTemplate)