2011-02-17 44 views
2

我試圖訪問ItemsPanelTemplate內的Canvas對象,所以我可以直接在代碼隱藏中添加項目。如何從代碼隱藏中訪問我的ItemPanelTemplate中的命名控件?

這是我的XAML:

<ListBox x:Name="MyMap" ItemsSource="{Binding MapItems}" 
     Background="Gray" 
     SelectionChanged="MyMap_SelectionChanged"> 

    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas x:Name="MyMapCanvas" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Background="Transparent"> 
      </Canvas> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

如何訪問「MyMapCanvas」中的代碼隱藏項補充呢?

我曾嘗試以下:

Canvas canvas = (Canvas)MyMap.ItemsPanel.LoadContent(); 

ContentPresenter cp = (ContentPresenter)(VisualTreeHelper.GetChild(MyMap, 0)); 
ItemsPanelTemplate ipt = MyMap.ItemsPanel; 
Canvas canvas = ipt.FindName("MyMapCanvas", cp) as Canvas; 

在此先感謝。

回答

1

試試這個:

//your OnLoaded handler 
    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) 
    { 
     Canvas canvas = FindVisualChild<Canvas>(MyMap); 
    } 

    public TChildItem FindVisualChild<TChildItem>(DependencyObject obj) where TChildItem : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      var child = VisualTreeHelper.GetChild(obj, i); 

      if (child != null && child is TChildItem) 
       return (TChildItem)child; 

      var childOfChild = FindVisualChild<TChildItem>(child); 

      if (childOfChild != null) 
       return childOfChild; 
     } 

     return null; 
    } 
+0

謝謝,它的工作原理。不幸的是,它不會讓我將東西添加到ItemsPanelTemplate中的Canvas,這對於大多數用途來說是有意義的。錯誤:無法顯式修改用作ItemsControl的ItemsPanel的Panel的Children集合。 ItemsControl爲Panel生成子元素。看起來我會修改我的方法。 – Paxenos 2011-02-17 14:58:45

相關問題