我在自定义WPF控件中有9个按钮,用于创建和显示9个不同的窗口。 此自定义控件位于应用程序的每个窗口中。 在每个按钮的button_click事件中,我使用相同的逻辑。唯一的区别是实例化窗口的第一行和第四行。下面的代码乘以9个按钮乘以11个窗口=很多冗余代码。
private void btnNav11_Click( object sender, RoutedEventArgs e )
{
Robot windowRobot = new Robot( Translations.CheckLanguage( ) );
toggleNavMenu(true);
this.Hide();
windowRobot.ShowDialog();
this.Show();
ChangeLanguage( Translations.CheckLanguage( ) );
windowRobot.Close( );
}
所以我将其重构为每次单击事件都会将字符串传递给方法,它会创建窗口:
public static void showAlarmHistory() {
showNewWindow( "AlarmHistory" );
}
public static void showNewWindow( string windowType ){
Window newWindow = CreateWindow( windowType );
newWindow.ShowDialog();
newWindow.Close();
}
public static Window CreateWindow( string windowToOpen ){
Window openWindow = null;
switch( windowToOpen ) {
case "AlarmHistory":
openWindow = new AlarmHistory( Translations.CheckLanguage() );
break;
...
...
}
上面的代码都按预期工作,但它不是一个巨大的重构增益,因为这个代码在每个windows代码后面都是重复的。
作为下一步,我在项目中创建了一个静态类来保存所有这些代码并在每个窗口中调用该类。 (上面的代码是我粘贴的静态类的实际代码片段)它没有那么好用,我也不知道如何正确使用它。
调用窗口不会关闭,会发生什么。窗户打开但是它们永远不会关闭,打开的窗户会堆积起来。
希望我清楚简洁。有什么建议?我非常感谢你的帮助。
杰夫
答案 0 :(得分:0)
这是一个建议。首先,创建一个基类:
public class MyWindow : Window
{
}
现在从这个窗口派生所有其他窗口:
public class AlarmHistory : MyWindow
{
// Your AlarmHistory window logic stuff here
}
public class OtherHistory : MyWindow
{
// Your Other windows logic stuff here
}
现在更改showAlarmHistory()
功能:
public static void showAlarmHistory() {
//showNewWindow( "AlarmHistory" );
showNewWindow(new AlarmHistory(Translations.CheckLanguage()));
}
最后更改您的showNewWindow()
功能:
public static void showNewWindow( MyWindow window ){
window.ShowDialog();
window.Close();
}
您在这里所做的只是创建一个新窗口。你的showNewWindow()
函数不应该关心它是什么类型。它只是做它需要的任何东西。您可以将常用自定义方法放在MyWindow
类中。如果需要,您可以将其投射到特定窗口。