WPF: выберите дочерний элемент управления в Canvas - PullRequest
0 голосов
/ 24 августа 2010

Быстрый вопрос, касающийся WPF: как выбрать дочерние элементы в Canvas / Grid?

Например, в следующем фрагменте XAML:

    <Canvas Name="parentCanvas" Width="200" Height="200" Background="AliceBlue" MouseMove="parentCanvas_MouseMove" MouseLeave="parentCanvas_MouseLeave">
        <Border Name="border1" Margin="10" Height="100" Width="180" Background="Maroon" Canvas.Top="47" />
    </Canvas>

... как я могу получить доступ к border1 в parentCanvas_MouseMove и parentCanvas_MouseLeave методах?

Кроме того, способ, которым я получаю доступ к холсту внутри обработчиков событий, выглядит немного странно, я делаю что-то вроде:

    private void parentCanvas_MouseLeave(object sender, MouseEventArgs e)
    {
        Canvas c = (Canvas)sender;
        c.Background = Brushes.Blue;
    }

Это правильный способ доступа к нему или есть более элегантный способ сделать это?

Большое спасибо,
Хамза.

1 Ответ

4 голосов
/ 24 августа 2010

Когда вы присваиваете имя элементу управления с атрибутом Name, он генерирует члена в классе, поэтому вы сможете получить к ним доступ по имени:

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e)
{
    Canvas c = parentCanvas;
    c.Background = Brushes.Blue;
    Border b = border1;
}

Если элементы управления являются частьюControlTemplate или DataTemplate, тогда вам нужно будет получить ссылку на родительский элемент и найти его в шаблоне.Например, если ваш XAML является частью DataTemplate, вам нужно будет сделать что-то вроде этого:

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e)
{
    Canvas c = (Canvas)sender;
    var contentPresenter = (ContentPresenter)c.TemplatedParent;
    var b = contentPresenter.ContentTemplate.FindName(
        "border1", contentPresenter);
}

В любом случае приведение параметра sender к соответствующему типу вполне разумно, и этопозволяет вам сделать ваши обработчики событий более пригодными для повторного использования.


Если у вас нет имени для вашего холста, вы также можете использовать свойство Children Canvas для итерации по его визуальным дочерним элементам:

private void parentCanvas_MouseLeave(object sender, MouseEventArgs e)
{
    Canvas c = (Canvas)sender;
    var firstChild = c.Children[0];
    var firstBorderChild = c.Children.OfType<Border>().FirstOrDefault();
}

Наконец, если у вас есть изображение, которое не является Panel, вы можете использовать VisualTreeHelper.GetChildrenCount и VisualTreeHelper.GetChild :

for (int childIndex = 0; 
     childIndex < VisualTreeHelper.GetChildrenCount(c); 
     childIndex++)
{
    var child = VisualTreeHelper.GetChild(c, childIndex);
}
...