none
WPF中的用户控件怎么改变触发窗体的控件? RRS feed

  • 问题

  • 场景:一个窗体中包括用户控件和一个Button,而用户控件本身又包括一个Button,怎么样才能通过用户控件中的Button来触发窗体本身的Butoon的Click事件?

    主要的问题是没有一个方法能够在用户控件中得到窗体对象,试过用this.Parent但是发觉得不到,希望大家帮看看
    电子商务人,电子商务路
    2009年12月28日 1:22

答案

  • mldark 用户奖牌用户奖牌用户奖牌用户奖牌你好,
    在实际运用中,嵌套的可能比这样多很多层,用起来很麻烦,想不到WPF这么常用的运用的API都没提供
    电子商务人,电子商务路

    wpf以后版本可能简化的 目前我想到这几个方法  在asp.net中也是这么麻烦的 它的母板只是当前实例属性封装的   
    2009年12月29日 10:29

全部回复

  • 请问一下 你这个窗体是什么? winfrom? 还是wpf?

       public partial class UserControl1 : UserControl
        {
            Window ww;
                public UserControl1(Window w )
               {
                InitializeComponent();
                ww = w;
              
                }
      ...................操作...........   


        }


    var u=new  UserControl1 (this);

    2009年12月28日 8:19
  • 是WPF窗体

    xmlns:local=".........";
    <local:

    直接通过x:Name方式使用,没有办法使用构造函数的方式传递变量。


    电子商务人,电子商务路
    2009年12月28日 10:27
  • 你这个方式 可能无法捕到当前窗口对象 (我没想到方法)
    只能代码模式捕到
    2009年12月28日 11:14
  • 楼主你好,
    你在当前的Window构千function中调用以下的方法先获得UserControl中的Buttton,再通过RaiseEvent方法调用窗体中Button.Click事件行不?

     Button button = (this.FindName("userControlName") as UserControl).FindName("ButtonName_UserControl") as Button;
                button.Click += delegate
                {
                    Button buttoninWindow;//button in window;
                    buttoninWindow.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
                };

    如有疑问,请继续回复。
    谢谢。
    Jim Zhou -MSFT
    2009年12月28日 13:12
    版主
  • Jim Zhou -MSFT

    你好,这种方式可以得到用户控件中的Button对象,但是在仍然不能得到窗体对象(逻辑上已经相反了,我的目的是从用户控件得到窗体对象,你现在这样是从窗体到用户控件)。


    而且Button的Click事件通常是用来提交一些数据之类的操作,如果用这种方式窗体和用户控件的耦合性太大,似乎建立用户控件就显得有点多余
    电子商务人,电子商务路
    2009年12月28日 16:10
  • 在asp.net中可以通过this.Page的方式得到用户控件所在的页,即使是在asp.net的母版页中也可以通过MasterType的方式取得,不懂为什么WPF中没有提供类似的方法。我找了很久都没有找到。也曾经使用过this.Partent的方式往上推逻辑树,好象也不太可行。


    电子商务人,电子商务路
    2009年12月28日 16:14
  • 你定义个window类型get/set 属性
    2009年12月29日 7:16
  • 哈,我今天也刚想到这样做可以实现,但是觉得这样用户控件窗体的耦合度太高,复用性就减低了很多,没有其它办法吗?

    谢谢mldark
    电子商务人,电子商务路
    2009年12月29日 7:28
  • <Window x:Class="WpfApplication1.Window19"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:WpfApplication1"
       x:Name="w19"  Title="Window19" Height="300" Width="300">
       
        <Grid Name="g" >
            <l:UserControl1  >
                    </l:UserControl1>
           

    用户控件里按钮
        private void button1_Click(object sender, RoutedEventArgs e)
            {
                Window19 w = ((Grid)this.Parent).Parent as Window19;
            }
    2009年12月29日 7:43
  • 楼主你好,

    如果你把UserControl放在window中的话,用this.Parent找到的应该不是当前所在的window,而是一个panel,因为你说了在当前window还有另一个Button,所以你应该用了一个panel来装UserControl和button,这种情况下,你可以手动写些代码来找到当前的window:

     Code snippet:

    public static DependencyObject GetAncestorByType(DependencyObject element, Type type)

            {

                if (element == null) return null;

                if (element.GetType() == type) return element;

                return GetAncestorByType(VisualTreeHelper.GetParent(element), type);

            }



    另外我想用Application.Current.MainWindow也是可以找到当前window的。

    如有其他疑问,请继续回复。
    谢谢。
    Jim Zhou -MSFT
    2009年12月29日 7:52
    版主
  • Jim Zhou -MSFT你好,
    Application.Current.MainWindow获取的是当前应用程序的主窗体,也就是startUri,而不是当前窗体

    看来还是得通过遍历可视树的方式得到
    电子商务人,电子商务路
    2009年12月29日 9:30
  • mldark 用户奖牌用户奖牌用户奖牌用户奖牌你好,
    在实际运用中,嵌套的可能比这样多很多层,用起来很麻烦,想不到WPF这么常用的运用的API都没提供
    电子商务人,电子商务路
    2009年12月29日 9:33
  • mldark 用户奖牌用户奖牌用户奖牌用户奖牌你好,
    在实际运用中,嵌套的可能比这样多很多层,用起来很麻烦,想不到WPF这么常用的运用的API都没提供
    电子商务人,电子商务路

    wpf以后版本可能简化的 目前我想到这几个方法  在asp.net中也是这么麻烦的 它的母板只是当前实例属性封装的   
    2009年12月29日 10:29
  • 谢谢mldark,我对asp.net较熟一点,我觉得他用masterType方式很方便啊
    电子商务人,电子商务路
    2009年12月30日 15:16
  • 谢谢mldark,我对asp.net较熟一点,我觉得他用masterType方式很方便啊
    电子商务人,电子商务路

    那是个自定义类型捕到当前母板实例而已 我也是asp.net的 经常在asp.net解答问题 对wpf刚入门的
    2009年12月30日 15:44
  • 谢谢,mldark,

    我也刚接触WPF,还请以后多多指点

    电子商务人,电子商务路
    2010年1月5日 2:04