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全局化,并在任何地方使用相同的实例。