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# 减少冗余窗口代码_C#_Wpf_Windows - Fatal编程技术网

C# 减少冗余窗口代码

C# 减少冗余窗口代码,c#,wpf,windows,C#,Wpf,Windows,我在自定义WPF控件中有9个按钮,用于创建和显示9个不同的窗口。 此自定义控件位于应用程序中的每个窗口上。 在每个按钮的按钮点击事件中,我使用相同的逻辑。唯一的区别是实例化窗口的第一行和第四行。下面的代码乘以9个按钮乘以11个窗口=大量冗余代码 private void btnNav11_Click( object sender, RoutedEventArgs e ) { Robot windowRobot = new Robot( Translations.CheckLanguage

我在自定义WPF控件中有9个按钮,用于创建和显示9个不同的窗口。 此自定义控件位于应用程序中的每个窗口上。 在每个按钮的按钮点击事件中,我使用相同的逻辑。唯一的区别是实例化窗口的第一行和第四行。下面的代码乘以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代码中重复

作为下一步,我在项目中创建了一个静态类来保存所有这些代码,并在每个窗口中调用该类。(上面的代码是我粘贴的静态类的实际代码片段)它工作得不太好,我不知道如何使它正确

发生的情况是调用窗口没有关闭。窗户是开着的,但从来没有关过,开着的窗户一直堆积如山

希望我说得够清楚和简洁。有什么建议吗?我非常感谢你的帮助


杰夫,这里有个建议。首先,创建一个基类:

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()));
}
public static void showNewWindow( MyWindow window ){   
    window.ShowDialog();
    window.Close();
}
最后更改
showNewWindow()
函数:

public static void showAlarmHistory() {
    //showNewWindow( "AlarmHistory" );
    showNewWindow(new AlarmHistory(Translations.CheckLanguage()));
}
public static void showNewWindow( MyWindow window ){   
    window.ShowDialog();
    window.Close();
}

您在这里所做的只是创建一个新窗口。您的
showNewWindow()
函数不应该关心它是什么类型的。它只是做它需要做的一切。您可以在
MyWindow
类中放置常见的自定义方法。如果需要,您可以将其投射到特定的窗口

在某处跟踪您打开的窗口。如果一次只想打开一个窗口,请在window类型的字段/属性中跟踪该窗口。打开新窗口之前,请查看字段/属性,如果它包含窗口对象,请关闭该窗口对象。然后在同一个字段/属性中选择新打开的窗口。这实际上更像是一个代码检查问题:elganzo,我接受了你的建议并做了一些调整,通过将父窗口的引用传递给子窗口使其工作,如果引用不是“主”窗口,我将其关闭。它工作得很好,谢谢你给我指出了正确的方向。mydogisbox,我不知道有一个codereview部分,也谢谢你提供我注册的信息。这似乎也是同样的工作方式;窗户一直堆起来。问题在于,在打开新窗口之前,永远不会调用当前的window.Close()。尽管如此,您确实让我走上了一条道路,使我能够将大量冗余代码移动到新的窗口基类中,该基类现在被我的所有其他窗口继承。谢谢你。