WPF在用户控件里怎么访问主窗体里的函数或控件

.Net技术 码拜 10年前 (2015-07-11) 1707次浏览 0个评论
 

例如主窗体(frmMain)里有个函数:
public void setok()
{

}

在用户控件(usercontrol_Test)里怎么访问主窗体(frmMain)里定义的函数或者主窗体里的控件?
在winform里我记得可以这样去访问主窗体的函数:
var frm = this.ParentForm as frmMain;
frm.setok();

但在WPF里这样写不行,在WPF里要怎么才能访问呢?求高手!

30分

WPF里面有一个Owner属性,你去看看

70分

高手绝对不会做这种设计的。
控件不应该去关心什么主窗体不主窗体的,因为是窗体控制控件而不是反过来。
所以应该考虑的是这个方法放到窗体里是否是必须的,如果不是必须的,那么请放到更低的层次,以便别的模块调用。
如果必须放到窗体里,那么首先应该想到的方法就是依赖倒置,定义公用接口,窗体实现接口,而控件调用接口。

 

汗,我当然知道公共方法写在公共类。我之所以要让用户控件去访问主窗体的函数,是因为想在用户控件去调用主窗体的函数去设置主窗体的控件。意思即是用户控件里的按钮点击之后就设置主窗体里的控件隐藏或者显示,难道这样的设计不正常 而且我标题说了又或者是用户控件怎么访问主窗体的控件,难道不会有这种设计??

 

用户控件里的文本的鼠标左键点击事件:
private void lbl_MenuName_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//frm_Manage为主窗体,Grid_MenuChildren为主窗体的一个控件
var frm = (this.Parent as frm_Manage);
frm.Grid_MenuChildren.Children.Clear();
}
我的意思即是用户控件里的文本被点击后就隐藏主窗体的一个控件,这样的设计不正常?

 
你做控件的时候会明确知道自己放到哪个窗体上吗?如果知道的话为什么不直接把控件的内容写到窗体了,封装的意义在于独立和复用,而不是为了给代码分块。
 

是的,这个用户控件只是在主窗体很多地方用到,所以就做了这个用户控件方便给主窗体调用而已。其实归根到底我只是想知道动态添加的用户控件要如何才能访问主窗体的控件而已,如果这样都做不到的话,那封装的用户控件有什么意义?其实我是封装一个固定窗体中常用到的用户控件而减少代码量,而不是做一个所有窗体或者所有程序都通用的控件!

 
基本的设计原则就是高内聚低耦合。
如果你的控件和窗体的联系这么紧密,那么其实他们就应该属于一体,这种情况下就可以把控件和窗体看成一个整体,由此得出的推论就是控件可以依赖并且必须依赖窗体,所以,你可以把窗体实例传到控件里面,直接调用就可以了。
 

受到启发,发现只要逐层向上即可:
private void cb_Checked(object sender, RoutedEventArgs e)
{
UC_FoodBtn foodBtn = new UC_FoodBtn(this);
var wrapPanal_food = (this.Parent as WrapPanel);
var scrollViewer2 = (wrapPanal_food.Parent as ScrollViewer);
var mainGrid = (scrollViewer2.Parent as Grid);
var scrollViewer = (mainGrid.Parent as ScrollViewer);
var mainWindow = (scrollViewer.Parent as MainWindow);
mainWindow.wp_ordered.Children.Add(foodBtn);
}


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明WPF在用户控件里怎么访问主窗体里的函数或控件
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!