Как получить доступ к именованному элементу управления в моем 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;
    }
Другие вопросы по тегам