如何调用“隐藏”一些WPF用户控件的方法

本文关键字:WPF 一些 用户 控件 方法 隐藏 何调用 调用 | 更新日期: 2023-09-27 18:17:07

这看起来很奇怪,但我将一些自定义WPF用户控件转换为WPF UserControl,我必须调用一些拥有所有这些控件的方法。这可能吗?怎么做呢?

foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
string kidType = kid.GetType().FullName;
if (kidType.EndsWith("MyUserControl"))
{
    UserControl myUserControl = (UserControl)kid;
    myUserControl.Hide() // <- this method I want to call bu it is "hidden" because of teh casting which doesn't provide access to it.

注意:Hide()是public方法

解决方案:

你好!

感谢您的输入!我终于找到了解决办法。

foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
  string kidType = kid.GetType().FullName;
  if (kidType.EndsWith("UControl"))
  {
     Type t = kid.GetType();
     object obj = Activator.CreateInstance(t);
     t.InvokeMember("Hide", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { });
      // And here there is a 1000% better solution of @Erno
      // dynamic myUserControl = kid;
      // myUserControl.Hide();
   }
}

在哪里
public void Hide()
{
    // do stuff
} 

如何调用“隐藏”一些WPF用户控件的方法

让所有的用户控件实现一个接口

public interface ICanHide
{
    void Hide();
}

然后执行

foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)  
{
   var tmp = kid as ICanHide;
   if (tmp != null)
   {
      tmp.Hide();
   }
}

dynamic可能有助于防止编写反射代码(参见此):

foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children) {
    string kidType = kid.GetType().FullName;
    if (kidType.EndsWith("MyUserControl"))
    {
        dynamic myUserControl = kid;
        myUserControl.Hide();  
    } 
}

确保添加了一些异常处理,以防遇到适合名称但不实现Hide的类型。

如果你担心这一点,你可以在所有的UserControls上实现一个接口,并尝试强制转换到那个接口。

你必须做一个额外的演员:

foreach (var kid in ((MainWindow)App.Current.Windows[0]).MainCanvas.Children)
{
    string kidType = kid.GetType().FullName;
    if (kidType.EndsWith("MyUserControl"))
    {
         UserControl myUserControl = (UserControl)kid;
         if (myUserControl is MyUserControlClass)
         {
             (myUserControl as MyUserControlClass).Hide();
         }
    }
}

MyUserControlClass是带有hide方法的类。如果您有一个具有相同Hide方法的控件集合,并且这些控件不是由具有Hide的基类派生的,则可以:

  1. 为每个控件类创建强制转换

  2. 创建你自己的控件,并让他们从一个接口的方法隐藏。

编辑:

或带反射:

typeof(ctrlobject.GetType()).GetMethod("Hide").Invoke(ctrlobject, new object[] { });
MyUserControl muc = kid as MyUserControl;
if (muc != null)
    muc.Hide();