2011-12-07 54 views
3

这似乎很奇怪,但我将一些自定义的WPF用户控件投射到WPF UserControl,我必须调用一些包含所有这些方法的方法。可能吗?怎么做?如何调用某些WPF用户控件的“隐藏”方法

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 
} 

回答

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上实现接口并尝试将其转换为该接口。

+0

谢谢!你的解决方案非常优雅!埃尔诺岩石! –

+0

不客气。请注意,我更喜欢解决方案来实现这个接口。只有当我不得不使用反射时,我才考虑这个“动态”解决方案,因为我无法访问UserControl。 –

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是隐藏方法的类。如果你有这不是由基类派生用相同的隐藏方法控制具有隐藏的集合,您可以:

  1. 创建每个控件类

  2. 创建自己的铸造控件,并让它们从Hide方法的接口继承。

编辑:

或与反思:

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

谢谢!但我不能像你建议的那样做,因为没有访问MyUserControlClass。我加载所有WPF用户控件。所以它可以是任何类型的用户控制。但是它们都有相同的方法 - Hide() –

+0

然后,对于每种类型,您必须检查控件是否属于该类型并将其转换为该类型。有没有隐藏很多用户控件,在那里? – hcb

+0

我使用Reflection创建WPF UserControls。所以我没有任何对类的引用... –

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

对不起,但它根本不适用于我。 –

+0

@Dmitry:如果'Hide()'是MyUserControl的成员,那么将UserControl读为MyUserControl。我已经更新了我的答案。它应该工作 – abatishchev

+0

@Dmitry:什么不起作用 - 你会得到什么错误? – abatishchev

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

非常感谢!你的解决方案也是可能的。但在我的情况下,我没有访问重新实现WPF用户控件公共部分类UControl:UserControl,ICanHide –

+0

你可以不创建一个额外的部分类实现接口? –

相关问题