开发者

WPF: Select child control within a Canvas

开发者 https://www.devze.com 2023-01-12 15:32 出处:网络
A quick question regarding WPF: How can I select child elements within a Canvas/Grid? For example, in the following XAML snippet:

A quick question regarding WPF: How can I select child elements within a Canvas/Grid?

For example, in the following XAML snippet:

    <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>

...how can I access border1 within parentCanvas_MouseMove and parentCanvas_MouseLeave methods?

Also, the way I access the canvas it开发者_C百科self within the event handlers looks a bit hacky, I do something along the lines of:

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

Is that the right way of accessing it or is there a more elegant way of doing this?

Many thanks,

Hamza.


When you name a control with a Name attribute, it will generate a member in the class, so you should be able to access them by name:

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

If the controls are part of a ControlTemplate or DataTemplate, then you would need to get a reference to the parent and look it up in the template. For example, if your XAML is part of a DataTemplate, you would have to do something like this:

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

In any case, casting the sender parameter to the appropriate type is perfectly reasonable, and it lets you make your event handlers more reusable.


If you don't have a name for your canvas, you can also use the Children property of the Canvas to iterate through its visual children:

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

Finally, if you have a visual that isn't a Panel, you can use VisualTreeHelper.GetChildrenCount and VisualTreeHelper.GetChild:

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

精彩评论

暂无评论...
验证码 换一张
取 消