从另一个usercontrol在usercontrol中引发事件

时间:2010-10-21 05:29:11

标签: wpf events user-controls delegates c#-4.0

如何从另一个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 个答案:

答案 0 :(得分:2)

通常,只有活动所有者才能举起活动。这有例外(例如在Windows窗体中使用Button.PerformClick,但它们必须由相关类专门提供。

WPF路由事件可能会在这里提供替代方案,但您还不清楚自己在谈论什么类型的事件。你要做的事情的一个例子会有所帮助。

答案 1 :(得分: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();
        }
    }
}

修改 kay所以看起来你想要调整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;
}

然后你可能想创建一个方法来像这样走下所有孩子:

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元素的StackPanel / Grid并且所有usercontrol2中的元素,以便您可以使用我发布的第一个代码。