2017-09-21 9 views
-2

두 개의 창 (KPIViewVAS 또는 KPIView)에서 'KeyHandler_F'를 호출하고 'ToggleWindow'를 사용하여 창 상태의 변경 사항을 실행할 수 있도록 아래 코드를 줄이려고합니다. 작품 아래의 코드하지만 DRY되지 않습니다 :두 개의 WPF 윈도우에 대한 요약 만들기

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'에 대한 명령을 이동하면 나는 오류 '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) 
     { 
     } 
    } 

} 

창문 'KPIViewVAS'와 'KPIView은'코드가 오류없이 감소 된 동적 사용의 피터 Duniho 제안을 사용

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); 
    } 
} 
+0

기본적인 문제는 컴파일러가 KPIViewVAS''에 대한 정보가 없다는 것입니다. 귀하의 두 번째 예에서, 그것은 유형이 아닙니다. 이는 _parameter_ 유형이며 _any_ 유형에 의해 일반 유형 'A '을 사용하는 코드로 대체 될 수 있습니다. 유감스럽게도, 사용하는 유형이 어떻게 보이는지, 또는 제네릭 클래스가 어떻게 보일지 이해하기에 좋은 [mcve] 또는 다른 문맥을 제공하는 것을 귀찮게하지 않았습니다. 컴파일러가 필요로하는 정보를 제공하기 위해 제약 조건에서 사용할 수있는 기본 유형이있을 수 있습니다. 또는 '동적'을 사용해야하거나 어쩌면 일반화하지 않아도됩니다. –

답변

0

다음과 같습니다. 모든 창

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

를 통해 사용에게 코드를 만들 수 있고, 클래스는 감소되었다 :

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; 
      } 
     } 
    } 
}