我Panel1
在这个里面Panel2
和这个里面Panel3
......所以想象一下
Panel1->Panel2->Panel3->button1
那么如何获得像这样的路径字符串
string path=\Panel1\Panel2\Panel3\button1
如果我想得到button1的所有父母。
我可以通过定义一个实现 IExtenderProvider 的类来做到这一点,那么是否可以在设计时实现它。
我Panel1
在这个里面Panel2
和这个里面Panel3
......所以想象一下
Panel1->Panel2->Panel3->button1
那么如何获得像这样的路径字符串
string path=\Panel1\Panel2\Panel3\button1
如果我想得到button1的所有父母。
我可以通过定义一个实现 IExtenderProvider 的类来做到这一点,那么是否可以在设计时实现它。
这是一个扩展方法,用于获取所有父母的姓名IEnumerable<string>
:
public static class Extensions
{
public static IEnumerable<string> GetControlPath(this Control c)
{
yield return c.Name;
if (c.Parent != null)
{
Control parent = c.Parent;
while (parent != null)
{
yield return parent.Name;
parent = parent.Parent;
}
}
}
}
这是我添加到将使用它的项目的 UserControl 的属性:
public partial class CustomControl : UserControl
{
public CustomControl()
{
InitializeComponent();
}
public string ControlPath
{
get
{
return string.Join(@"\", this.GetControlPath().Reverse());
}
}
}
构建后,将用户控件从工具箱拖到窗体上。一定要很好地将它嵌套在其他控件中。我嵌套了 3 个面板并将其放在与您的示例类似的最里面的面板中。以下是设计时属性的外观:
这应该适用于您创建的任何派生自Control
. IExtenderProvider
在这里似乎无关紧要。