在单击时获取代码的控件名称,wpf

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在单击时获取代码的控件名称,wpf相关的知识,希望对你有一定的参考价值。

我有一个用户控件,我想获得用户在此用户控件上单击的控件的名称。

下面提供了Usercontrol xaml:

<Grid Name="Grid1">
 <ListView Name ="ListView1">
  <listbox.resources>
   <Datatemplate>
     <Togglebutton Name="Button1">
     </Togglebutton>
   </Datatemplate>
  </listbox.resources>
 </Listview>
 <Border Name="Border1">
 <ContentControl>
 </ContentControl>
 </Border>
</Grid>

现在在我的代码后面,我写了:

this.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(mouseclicked);

private void mouseclicked(object sender, MouseButtonEventArgs e)
    {
        var source = e?.OriginalSource as FrameworkElement;
        if (source != null)
        {
            var parent = source.Parent as FrameworkElement;
            string name = string.Empty;
            if (parent != null)
            {
                name = parent.Name;
            }
            else
            {
                name = source.Name;
            }

            //If clicked outside the usercontrol, then usercontrol should close down
            if (!(name.Contains("Border1") || name.Contains("Grid1"))) //very strange values sometimes null or empty
            {
                //then do something
            }
        }
    }

如何在代码隐藏中获取用户控件中使用的控件的名称

答案

您已经在XAML中为表格,边框和列表视图指定了名称。您应该在代码隐藏中访问它,并检入[[mouseclicked事件,该事件位于鼠标上方。

private void mouseclicked(object sender, MouseButtonEventArgs e) { if (ListView1.IsMouseOver && Grid1.IsMouseOver) { MessageBox.Show($"List view clicked"); } if (Border1.IsMouseOver && Grid1.IsMouseOver) { MessageBox.Show($"Border1 clicked"); } if (Grid1.IsMouseOver) { MessageBox.Show($"Grid1 clicked"); } }
这可能不是最好的方法,但是可以用来获取用户单击的控件的名称。

以上是关于在单击时获取代码的控件名称,wpf的主要内容,如果未能解决你的问题,请参考以下文章

WPF前台xaml中的控件名在后台拿不到,后台代码中显示“当前上下文不存在名称‘xxx’”

获取父用户控件WPF C#的名称

VS下WPF自定义控件的基本步骤和基本代码实现

如何按名称或类型查找WPF控件?

如何处理 WPF 中的鼠标滚轮单击事件?

Linux QT 中控件QTableView相应鼠标事件