Как получить доступ к именованному элементу управления в моем ItemPanelTemplate из кода кода?
Я пытаюсь получить доступ к объекту Canvas внутри ItemsPanelTemplate, чтобы я мог добавлять элементы непосредственно к нему в коде позади.
Вот мой 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;
}