随笔 - 55  文章 - 15  trackbacks - 0
<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


      看来没有承接上第七章,有点失败了。还没来得及研究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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理