2010-10-21 74 views
0

如何在另一个用户控件中引发usercontrol中的事件。我试图做与代表,但它不起作用。我怎样才能做到这一点。正在使用C#(WPF)在另一个用户控件的用户控件中引发事件

usercontrol1.cs

public partial class UserControl1 : UserControl 
{ 
    delegate void myDelegate(); 



    public UserControl1() 
    { 
     InitializeComponent(); 


    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     UserControl2 obj = new UserControl2(); 

     myDelegate d = new myDelegate(obj.CallDelegate); 
     obj.CallDelegate(); 

    } 
} 

Usercontrol2.cs

public partial class UserControl2 : UserControl 
{ 

    public UserControl2() 
    { 
     InitializeComponent(); 
    } 

    public void CallDelegate() 
    { 
     this.Width = 50; 
     this.Height = 50; 
     MessageBox.Show("Method called "); 
    } 

} 

当我使用委托我可以去获取从方法的消息框,但控制犯规调整大小。我想要再次渲染它?我试图明确指定,但不起作用

+0

请给出你想要做什么的更多细节,你已经尝试过,以及它是如何失败的。 – 2010-10-21 05:49:17

+0

我在下面的答案中添加了更多详细信息。我渴望做到这一点。你可以告诉我如何 – 2010-10-21 06:00:16

回答

1

这是因为在你的代码中,你在一个新的UserControl2上引发了一个事件。 UserControl1.button1_Click事件应该是这样的:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    if (this.Parent != null && this.Parent is StackPanel) 
    { 
     StackPanel parentControl = this.Parent as StackPanel; 
     foreach (UIElement child in parentControl.Children) 
     { 
      if (child is UserControl2) 
       ((UserControl2)child).CallDelegate(); 
     } 
    } 
} 

编辑: 凯,所以它似乎你想获得window1中的所有usercontrol2被调整大小。那么你需要的是做一个递归函数来获取最顶层的父,如(从hardcodet.net/2008/02/find-wpf-parent改装成)

DependencyObject GetHighestParent(DependencyObject child) 
{ 
    ContentElement contentElement = child as ContentElement; 
    if (contentElement != null) 
    { 
     DependencyObject parent = ContentOperations.GetParent(contentElement); 
     if (parent != null) return parent; 

     FrameworkContentElement fce = contentElement as FrameworkContentElement; 
     return fce != null ? fce.Parent : null; 
    } 

    FrameworkElement frameworkElement = child as FrameworkElement; 
    if (frameworkElement != null) 
    { 
     DependencyObject parent = frameworkElement.Parent; 
     if (parent != null) 
     { 
      return GetHighestParent(parent); 
     } 
     else 
     { 
      return child; 
     } 
    } 

    DependencyObject visualParent = VisualTreeHelper.GetParent(child); 

    if (visualParent != null) 
     return GetHighestParent(visualParent); 
    else 
     return child; 
} 

,那么你可能要创建一个方法walkdown所有的孩子是这样的:

void CallDelegateInAllControl2(DependencyObject parent) 
{ 
    int childCount = VisualTreeHelper.GetChildrenCount(parent); 

    for (int i = 0; i < childCount; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     if (child is UserControl2) 
     { 
      ((UserControl2)child).CallDelegate(); 
     } 
     else 
     { 
      CallDelegateInAllControl2(child); 
     } 
    } 
} 

,然后你把它Button1_Click事件中

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    DependencyObject parent = GetHighestParent(this); 

    if(parent!=null) 
     CallDelegateInAllControl2(parent); 
} 

注:散步,好父母和孩子可能是棘手和危险的,我认为,我相信这是一个长 所以你可能只想重新布局你的window1,所以它有一个带有usercontrol1元素和所有usercontrol2元素的StackPanel/Grid,所以你可以使用我发布的第一个代码。

+0

@ dnr3谢谢,很棒 – 2010-10-21 06:52:12

+0

不用担心先生。 – dnr3 2010-10-21 07:34:15

+0

@ dnr3:当我提到这一点。父级作为StackPanel; 它将该usercontrol中的所有控件作为childrens,但在我的主窗体中使用了更多的usercontrol。我如何将我的mainWindow中的所有usercontrols分配给stackpanel children? – 2010-10-21 07:52:24

2

一般而言,只有事件所有者才能提出事件。也有例外情况(例如在Windows窗体中使用Button.PerformClick,但它们必须由有问题的类明确提供。)

有可能WPF路由事件可能会在此处提供替代,但您尚未清楚关于你正在谈论的事件的一个例子,

+0

海恩乔恩,我不能完全从你的说法理解,也意味着时间也剂量提到事件,我已附上一个样本在这里。 http://cid-08ec3041618e8ee4.office.live.com/self.aspx/blog/delegates.rar – 2010-10-21 05:53:23

+0

在窗体中有两个用户控件,当我在一个用户控件中单击调整大小时,我想升起事件来调整大小另一个用户控件 – 2010-10-21 05:54:20

+0

@deep:编辑代码 - 只是一个小例子 - 将会更好,而不是仅仅发布一个rar文件。我怀疑你会发现很难做出一个控制*只是*提高其他控件的resize事件...但是是第二个控件*实际上*被调整大小了吗?你能明确地设置大小吗? – 2010-10-21 06:05:53

相关问题