看来没有承接上第七章,有点失败了。还没来得及研究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; 这样是不行滴。
posted on 2012-10-22 21:26
Dino-Tech 阅读(1130)
评论(0) 编辑 收藏 引用