如何调用“隐藏”一些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
}
让所有的用户控件实现一个接口
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的基类派生的,则可以:
为每个控件类创建强制转换
创建你自己的控件,并让他们从一个接口的方法隐藏。
或带反射:
typeof(ctrlobject.GetType()).GetMethod("Hide").Invoke(ctrlobject, new object[] { });
MyUserControl muc = kid as MyUserControl;
if (muc != null)
muc.Hide();