2011-12-07 6 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:

こんにちはすべて!

ありがとうございました!最後に私は解決策を得ました。 MyUserControlClassが非表示方法とクラスです

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

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

あなたには、いくつかの例外を追加していることを確認します名前に合った型に遭遇したがimpではない隠す。

あなたがすべてのUserControls上にインターフェイスを実装し、代わりにそのインターフェイスに試してみると心配な人は、

+0

ありがとうございました!あなたのソリューションは本当にエレガントなものです!エルノ岩! –

+0

ようこそ。私は、これ以上のインターフェースを実装するソリューションを好むことに注意してください。私はUserControlsへのアクセスがないので、私は反射を使用しなければならないときにのみ、この '動的な '解決策を検討します。 –

0

あなたは余分なキャストを行う必要がありますされ

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

。あなたが非表示にしている基底クラスによって派生されていない同じ隠す方法とコントロールのコレクションを持っている場合は、次のいずれかを実行します

  1. は、すべてのコントロールクラス

  2. 独自に作成するためのキャストを作成します。コントロールを作成し、メソッドHideを使用してインターフェイスから継承させます。

編集:

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

感謝を行い、その後インタフェース

public interface ICanHide { void Hide(); } 

を実装してください!しかし、MyUserControlClassへのアクセスがないため、あなたが示唆するようにすることはできません。私はすべてのWPFユーザーコントロールを飛んで読み込みます。したがって、任意のタイプのユーザーコントロールが可能です。しかし、それらのすべてが同じメソッドを持っています - Hide() –

+0

次に、各タイプについて、コントロールがそのタイプであるかどうかをチェックし、そのタイプにキャストしなければなりません。隠れている多くのユーザーコントロールはありません、ありますか? – hcb

+0

Reflectionを使用してWPF UserControlsを作成します。だから私はクラスへの参照を持っていないdain't ... –

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

申し訳ありませんが、私にとってはまったく機能しません。 –

+0

@Dmitry: 'Hide()'が 'MyUserControl'のメンバーであれば、UserControlをMyUserControlとして読み込みます。私は私の答えを更新しました。それは動作するはずです – abatishchev

+0

@ドミトリー:正確に何がうまくいかない - どのようなエラーがありますか? – abatishchev

3

ユーザーコントロールのすべてがこの

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

インターフェイスを実装する追加の部分クラスを作成できませんでしたか? –

関連する問題