2010-10-21 3 views
0

Как поднять событие в usercontrol из другого usercontrol. я пытался делать с делегатами, но он не работает. Как я могу это сделать. Я использую C# (WPF)Поднятие события в usercontrol из другого usercontrol

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 "); 
    } 

} 

когда я использую делегат я могу пойти получить MessageBox из метода, но контроль оленьей кожи изменение размера. я хочу вернуть его снова? я попытался назначить явно, но не работает

+0

Пожалуйста, сообщите более подробную информацию о том, что вы пытаетесь сделать, и вы попытались, и как это произошло. –

+0

Я добавил более подробную информацию в ваш ответ ниже. Я умираю, чтобы сделать это. можешь ли ты мне позвонить, как –

ответ

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(); 
     } 
    } 
} 

EDIT: kay, поэтому, похоже, вы хотите, чтобы все usercontrol2 в окне1 изменилось. то, что вам нужно сделать рекурсивную функцию, чтобы получить наивысочайший родитель, например, (мод от 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); 
} 

примечания: прогулка, чтобы получить родитель и ребенок может быть сложным и рискованным я думаю, и я считаю, что это длинный так что вы можете просто переустановить окно1, поэтому у него есть StackPanel/Grid с элементом usercontrol1 и всеми элементами usercontrol2 внутри него, чтобы вы могли использовать первый код i post.

+0

@ dnr3 Спасибо, отлично –

+0

не беспокоится сэр. – dnr3

+0

@ dnr3: Когда я упоминаю об этом.Родитель как StackPanel; он принимает все contorls в этом usercontrol как дети, но я использую больше, чем один usercontrol в моей основной форме. как я могу назначить все usercontrols в моем mainWindow дочерним элементам стековой панели ?????? –

2

В общем, только владелец события может поднять событие. Существуют исключения из этого (например, с Button.PerformClick в Windows Forms, но они должны быть специально предоставлены классом, о котором идет речь.

Возможно, что события с маршрутизацией WPF могут дать альтернативу здесь, но вы не были понятны о каких событиях вы говорите. Пример того, что вы пытаетесь сделать, был бы полезен.

+0

Хай Йон, я не могу полностью понять ваше высказывание, я имею в виду также время, когда я упоминал об этом событии, я привел образец здесь. http://cid-08ec3041618e8ee4.office.live.com/self.aspx/blog/delegates.rar –

+0

есть два пользовательских элемента управления в форме, когда я нажимаю изменение размера в одном пользовательском элементе управления, я хочу, чтобы это событие изменилось другой usercontrol –

+0

@deep: было бы лучше отредактировать код - только небольшой образец - в ваш вопрос, а не просто опубликовать rar-файл. Я подозреваю, что вам будет сложно сделать один элемент управления * просто * поднять событие изменения размера для другого элемента управления ... но второй элемент управления * на самом деле изменяется в любом случае? Можете ли вы просто указать размер явно? –

Смежные вопросы