为两个 WPF 创建摘要 Windows

Creating an abstract for two WPF Windows

我正在尝试减少下面的代码,以便我可以从 window(KPIViewVAS 或 KPIView)调用 'KeyHandler_F' 并使用 [= 执行对 window 状态的更改21=]。下面的代码有效但不是 DRY:

namespace KPI_Monitor_WPF.UI
{

class FullScreen
{
    public abstract class A<KPIViewVAS>
    {
        public abstract void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV);
        protected abstract void ToggleWindow(KPIViewVAS KVV);
    }

    public class B : A<KPIViewVAS>
    {
        public override void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV)
        {
            if (e.Key == Key.F)
            {
                ToggleWindow(KVV);
            }
        }
        protected override void ToggleWindow(KPIViewVAS KVV)
        {
            switch (KVV.WindowState)
            {
                case (WindowState.Maximized):
                    {
                        KVV.WindowState = WindowState.Normal;
                        KVV.WindowStyle = WindowStyle.ToolWindow;
                    }
                    break;

                default:
                    {
                        KVV.WindowState = WindowState.Maximized;
                        KVV.WindowStyle = WindowStyle.None;
                    }
                    break;
            }
        }
    }

    public class C : A<KPIView>
    {
        public override void KeyHandler_F(object sender, KeyEventArgs e, KPIView KVV)
        {
            if (e.Key == Key.F)
            {
                ToggleWindow(KVV);
            }
        }
        protected override void ToggleWindow(KPIView KVV)
        {
            switch (KVV.WindowState)
            {
                case (WindowState.Maximized):
                    {
                        KVV.WindowState = WindowState.Normal;
                        KVV.WindowStyle = WindowStyle.ToolWindow;
                    }
                    break;

                default:
                    {
                        KVV.WindowState = WindowState.Maximized;
                        KVV.WindowStyle = WindowStyle.None;
                    }
                    break;
            }
        }
    }

}
}

我开始使用下面的示例减少代码,但是一旦我将 'ToggleWindow' 的命令移动到摘要 class 下,我就收到错误消息,指出 'KVV.WindowState' 找不到:

class FullScreen
{
    public abstract class A<KPIViewVAS>
    {
        public virtual void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV) {
            if (e.Key == Key.F)
            {
                ToggleWindow(KVV);
            }
        }
        public virtual void ToggleWindow(KPIViewVAS KVV)
        {
            switch (KVV.WindowState)
            {
                case (WindowState.Maximized):
                    {
                        KVV.WindowState = WindowState.Normal;
                        KVV.WindowStyle = WindowStyle.ToolWindow;
                    }
                    break;

                default:
                    {
                        KVV.WindowState = WindowState.Maximized;
                        KVV.WindowStyle = WindowStyle.None;
                    }
                    break;
            }
        }
    }
    }

    public class B : A<KPIViewVAS>
    {
        public override void KeyHandler_F(object sender, KeyEventArgs e, KPIViewVAS KVV)
        {

        }
        public override void ToggleWindow(KPIViewVAS KVV)
        {
        }
    }

    public class C : A<KPIView>
    {
        public override void KeyHandler_F(object sender, KeyEventArgs e, KPIView KVV)
        {
        }
        protected override void ToggleWindow(KPIView KVV)
        {
        }
    }

}

下面是windows'KPIViewVAS'和'KPIView'

    public partial class KPIViewVAS : Window
{

    public KPIViewVAS()
    {
        InitializeComponent();
    }

    private void KeyHandler_F(object sender, KeyEventArgs e)
    {
        FullScreen.B switchScreen = new FullScreen.B();
        switchScreen.KeyHandler_F(sender, e, this);
    }
}

 public partial class KPIView : Window
{

    public KPIView()
    {
        InitializeComponent();
    }

    private void KeyHandler_F(object sender, KeyEventArgs e)
    {
        FullScreen.A switchScreen = new FullScreen.A();
        switchScreen.KeyHandler_F(sender, e, this);
    }
}

根据 Peter Duniho 关于使用动态代码的建议,代码已减少且没有任何错误。任何 window 都可以通过

使用代码
    private void KeyHandler_F(object sender, KeyEventArgs e)
    {
        fullScreen.adjustScreen switchScreen = new fullScreen.adjustScreen();
        switchScreen.KeyHandler_F(sender, e, this);
    }

并且 class 缩减为:

public class fullScreen
{
public class adjustScreen
    {
        public void KeyHandler_F(object sender, KeyEventArgs e, dynamic KVV)
        {
            if (e.Key == Key.F)
            {
                ToggleWindow(KVV);
            }
        }
        private void ToggleWindow(dynamic KVV)
        {
            switch (KVV.WindowState)
            {
                case (WindowState.Maximized):
                    {
                        KVV.WindowState = WindowState.Normal;
                        KVV.WindowStyle = WindowStyle.ToolWindow;
                    }
                    break;

                default:
                    {
                        KVV.WindowState = WindowState.Maximized;
                        KVV.WindowStyle = WindowStyle.None;
                    }
                    break;
            }
        }
    }
}