вызывая событие в usercontrol из другого usercontrol - PullRequest
0 голосов
/ 21 октября 2010

Как вызвать событие в usercontrol из другого 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 ");
    }

}

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

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

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

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

1 голос
/ 21 октября 2010

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

тогда, возможно, вы захотите создать метод для обхода всех детей следующим образом:

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 внутри него, так что вы можете использовать первый код, который я публикую.

...