wpf canvas获取子名称

时间:2014-02-20 14:36:25

标签: c# wpf xaml canvas

我画了一些有孩子的画布。

<Canvas Name="Canvas" MouseDown="getElements">
    <Rectangle  Height="200" Width="200" Name="Element1"/>
    <Rectangle  Height="200" Width="200" Name="Element2"/>
</Canvas>

并点击一个canvas元素,我想得到点击元素的名称,如下所示:

public void getElements(object Sender, EventArgs e)
{
     DependencyObject dpobj = Sender as DependencyObject;
     string name = dpobj.GetValue(FrameworkContentElement.NameProperty) as string;

     Console.WriteLine("Element Clicked: " + name);
}

但我只得到画布的名称。任何人都可以帮我获取点击元素的名称吗?

提前感谢!

3 个答案:

答案 0 :(得分:3)

由于MouseDown是路由事件而不是EventArgs使用RoutedEventArgsMouseDown,您可以使用MouseButtonEventArgs。它会为您提供OriginalSource属性,您可以尝试获取Name e.OriginalSource

private void getElements(object sender, MouseButtonEventArgs e)
{
    var elementName = (e.OriginalSource as FrameworkElement).Name;
}

答案 1 :(得分:0)

事件从画布中的元素路由。要获取原始源,您可以使用RoutedEventArgs:

public void getElements(object Sender, RoutedEventArgs e)
{
    DependencyObject dpobj = e.OriginalSource as DependencyObject;
    string name = dpobj.GetValue(FrameworkContentElement.NameProperty) as string;

    Console.WriteLine("Element Clicked: " + name);
}

答案 2 :(得分:0)

您可以在Canvas上为MouseLeftButtonUp事件创建一个事件处理程序(因为WPF使用路由事件,事件将'冒泡'到父母,并且也会在那里被提升)。 XAML代码看起来有点像这样:

<Window x:Class="CanvasChildren.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Canvas MouseLeftButtonUp="UIElement_OnMouseLeftButtonUp">
        <Rectangle Canvas.Top="10" Canvas.Left="10" Height="200" Width="200" Name="Element1" Fill="LightBlue"/>
        <Rectangle Canvas.Left="250" Canvas.Top="100" Height="200" Width="200" Name="Element2" Fill="DarkSalmon"/>
    </Canvas>
</Window>

在您的代码隐藏文件中,您可以通过访问事件参数的Source属性来检索单击的原始对象,如下面的代码所示:

private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    var rectangle = (Rectangle) e.Source;
    var name = rectangle.Name;
}

您可以下载我的完整示例here(这是Dropbox链接)。