Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从几个用户控件在WPF窗口中动态更改内容_C#_Wpf_User Controls - Fatal编程技术网

C# 从几个用户控件在WPF窗口中动态更改内容

C# 从几个用户控件在WPF窗口中动态更改内容,c#,wpf,user-controls,C#,Wpf,User Controls,我有两个用户控件,例如LogInControl和CheckControl。最初,该窗口包含LogInControl,成功登录后,登录窗口将更改:该窗口包含CheckControl 它是来自main窗口的代码 public MainWindow() { InitializeComponent(); LogInControl logInControl = new LogInControl(); CheckCon

我有两个用户控件,例如
LogInControl
CheckControl
。最初,该窗口包含
LogInControl
,成功登录后,登录窗口将更改:该窗口包含
CheckControl

它是来自
main窗口的代码

public MainWindow()
        {
            InitializeComponent();

            LogInControl logInControl = new LogInControl();
            CheckControl checkControl = new CheckControl();
            logInControl.OnSuccessfulLogin += (senser, e) =>
            {
                ChangeContentControl("Check");
            };

            checkInControl.LogOutClick += (senser, e) =>
            {
                ChangeContentControl("LogIn");
            };
            this.contentControl.Content = logInControl;
        }

        public void ChangeContentControl(string kindContentControl)
        {
            switch (kindContentControl)
            {
                case "LogIn":
                    {
                        ...
                        this.contentControl.Content = new LogInControl();
                    }
                    break;
                case "Check":
                    {
                        ...
                        this.contentControl.Content = new CheckControl();
                    }
                    break;
            }
        }
它是来自
LogInControl

public event EventHandler OnSuccessfulLogin;
private void loginButton_Click(object sender, RoutedEventArgs e)
        {
            OnSuccessfulLogin?.Invoke(this, e);
        }
public event EventHandler LogOutClick;
        private void logOutButton_Click(object sender, RoutedEventArgs e)
        {
            LogOutClick?.Invoke(this, e);
        }
它工作正常。但“CheckControl”有“Logout”按钮,单击此按钮时,窗口中应显示“LogInControl”内容。但它没有发生

它是来自
CheckControl

public event EventHandler OnSuccessfulLogin;
private void loginButton_Click(object sender, RoutedEventArgs e)
        {
            OnSuccessfulLogin?.Invoke(this, e);
        }
public event EventHandler LogOutClick;
        private void logOutButton_Click(object sender, RoutedEventArgs e)
        {
            LogOutClick?.Invoke(this, e);
        }
注销单击
当您切换到带有
检查InControl智能驭享
的窗口时,事件跟踪停止(注销单击变为空)。
我不明白为什么会这样。请帮帮我。

您面临的问题是,当您切换控件时,您正在创建新的控件。新的未注册事件。因此,您正在覆盖先前创建的已注册事件

switch (kindContentControl)
{
    case "LogIn":
    {
        ...                           
        this.contentControl.Content = new LogInControl(); <- here
                                      ^^^------------
    }
    break;

    case "Check":
    {
        ...
        this.contentControl.Content = new CheckControl(); <- here
    }
    break;
}
开关应该是这样的:

switch (kindContentControl)
{
    case "LogIn":
    {
        ...
        this.contentControl.Content = this.logInControl;                    
    }
    break;

    case "Check":
    {
        ...
        this.contentControl.Content = this.checkControl;
    }
    break;
}

可以为每个控件创建2个实例。构造函数中的第一个,它们被订阅到事件。第二个是ChangeContentControl方法,它们没有事件订阅

因此,您可以通过将控件存储在局部变量中来重用它们

LogInControl logInControl = new LogInControl();
CheckControl checkControl = new CheckControl();

public MainWindow()
{
    InitializeComponent();

    logInControl.OnSuccessfulLogin += (senser, e) =>
    {
        ChangeContentControl("Check");
    };

    checkInControl.LogOutClick += (senser, e) =>
    {
        ChangeContentControl("LogIn");
    };
    this.contentControl.Content = logInControl;
}

public void ChangeContentControl(string kindContentControl)
{
    switch (kindContentControl)
    {
        case "LogIn":
            {
                ...
                this.contentControl.Content = logInControl ;
            }
            break;
        case "Check":
            {
                ...
                this.contentControl.Content = checkControl;
            }
            break;
    }
}
也可以向事件订阅新实例。订阅控件是在单独的方法中创建的,以避免代码重复

public MainWindow()
{
    InitializeComponent();

    this.contentControl.Content = getLogInControl();
}

private LogInControl getLogInControl()
{
    LogInControl logInControl = new LogInControl();
    logInControl.OnSuccessfulLogin += (senser, e) =>
    {
        ChangeContentControl("Check");
    };
    return logInControl;
}

private CheckControl getCheckControl()
{
    CheckControl checkControl = new CheckControl();
    checkControl.LogOutClick += (senser, e) =>
    {
        ChangeContentControl("LogIn");
    };
    return checkControl;
}

public void ChangeContentControl(string kindContentControl)
{
    switch (kindContentControl)
    {
        case "LogIn":
            {
                ...
                this.contentControl.Content = getLogInControl();
            }
            break;
        case "Check":
            {
                ...
                this.contentControl.Content = getCheckControl();
            }
            break;
    }
}

1.移动
logout的订阅单击
ChangeContentControl
方法或2中的
事件。使windows Declaration全局化,并在任何地方使用相同的实例。