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

时间:2011-12-07 12:01:06

标签: c# .net wpf

这看起来很奇怪,但是我将一些自定义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()是公开的。

SOLUTION:

大家好!

感谢您的投入!最后我得到了解决方案。

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
} 

4 个答案:

答案 0 :(得分:3)

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

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();
   }
}

答案 1 :(得分:2)

dynamic可能有助于防止编写反射代码(See this):

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();  
    } 
}

请确保添加一些异常处理,以防您遇到符合名称但未实现隐藏的类型。

如果您担心这一点,您可以在所有UserControl上实现一个接口,然后尝试使用该接口。

答案 2 :(得分:0)

你必须多做一次演员:

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. 创建您自己的控件,让它们从方法Hide继承。

  3. 编辑:

    或反思:

    typeof(ctrlobject.GetType()).GetMethod("Hide").Invoke(ctrlobject, new object[] { });
    

答案 3 :(得分:0)

MyUserControl muc = kid as MyUserControl;
if (muc != null)
    muc.Hide();