2010-10-21 106 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

相關問題