2012-06-28 115 views
0

我的代碼並不是真的那麼相關,只是爲了給你背景,我有一個方法可以打開窗口的實例messageWindow這樣;傳遞窗口/類型作爲參數

private void SetMessagePosition(Controls.Button btn, string text) 
     { 
      messageWindow = new messageWindow(text); 
      relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0)); 

      messageWindow.Left = relativePoint.X + this.Left; 
      messageWindow.Top = relativePoint.Y + this.Top; 
      messageWindow.Show(); 
     } 

但我想看看我是否也可以用這種方法打開其他窗口。這顯然意味着將我想要打開的新窗口的名稱作爲參數傳遞給它。我的問題是,如何?我曾嘗試傳遞參數像這樣;

private void SetMessagePosition(Window newWin, Controls.Button btn, string text)) 
     { 
      newWin = new newWin(text); 
      ... 

其中newWin =我想要打開的窗口的類型。但顯然new newWin部分會拋出一個錯誤,因爲VS不知道名爲newWin的窗口。

我知道你的第一個想法可能是,爲什麼不在調用這個方法之前實例化窗口,那麼我可以一起跳過這一行。那麼這個方法實際上設置了新窗口在打開時相對於父窗口的位置,ergo,我現在不能設置它的位置。

我想要嘗試的另一件事是;

List<Window> winList; 
List<Type> winListType; 

winList.Add(window1); 
winList.Add(window2); 
winList.Add(window3); 

winListType.Add(Window1); 
winListType.Add(Window2); 
winListType.Add(Window3); 

SetMessagePosition(winList[2], winListType[2], btn1, "Yes"); 

private void SetMessagePosition(Window newWin, Type newWinType, Controls.Button btn, string text)) 
     { 
      newWin = new newWinType(text); 
      ... 

newWinType不喜歡被通過的Type,而不是一個變量,即使它是Type列表。如果有人知道這樣做的方式/解決方法,我會非常感動。

+0

更靈活我建議使用接口,而不是窗口和類型 – HichemSeeSharp

+0

@HichemC道歉,但我沒有接口的知識。現在將閱讀他們。 – windowskm

回答

2

你需要使它成爲一個通用的方法,這樣你就可以通過類型:

private void SetMessagePosition<T>(Controls.Button btn, string text) where T : Window, new() 
{ 
    T window = new T(); 
    relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0)); 
    window.Left = relativePoint.X + this.Left; 
    window.Top = relativePoint.Y + this.Top; 
    window.Show(); 
} 

然後,你可以調用它是這樣的:

SetMessagePosition<messageWindow>(btn, text); 

但是,這種方法的缺點是,當通過泛型類型實例化對象時,無法將任何內容傳遞給構造函數。所以,你需要以不同的方式在窗口上設置文本,比如創建一個具有SetText方法的接口,或者類似的東西,並且可以將其添加爲泛型類型的另一個約束。

你可以通過簡單的期待已經被實例化的新窗口,並傳遞到方法,而不是方法簡化了整個的混亂實例化它本身:

private void SetMessagePosition(Window window, Controls.Button btn) 
{ 
    relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0)); 
    window.Left = relativePoint.X + this.Left; 
    window.Top = relativePoint.Y + this.Top; 
    window.Show(); 
} 

然後,你可以只稱呼它:

SetMessagePosition(new newWin(text), btn); 
+0

因此,我正在使用上面的內容,但它指向我的初始化行和錯誤「無法創建變量類型的實例'T',因爲它沒有new()約束」。有任何想法嗎? – windowskm

+0

我想知道它是否可能有這樣的東西,以http://stackoverflow.com/questions/980629/what-is-the-syntax-to-use-c-sharp-generics-as-a-constructor-name – windowskm

+0

我通過添加'new()'約束來修正我的例子,因此'T'類型被強制爲可以用'new'關鍵字和一個無參數構造函數實例化。不幸的是,你的窗口在構造函數中使用了文本,所以必須以不同的方式完成。 –

2

使用的界面像這樣的:

interface IWindow 
    { 
     int Left 
     { 
      get; 
      set; 
     } 
     int Right 
     { 
      get; 
      set; 
     } 
    void ShowWindow(); 
} 

在所有的窗口是無論什麼類型的然後實現它。

public partial class MainWindow : Window , IWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

     } 



     public new int Left 
     { 
      get 
      { 
       return Left; 
      } 
      set 
      { 
       Left = value; 
      } 
     } 

     public int Right 
     { 
      get 
      { 
       return Right; 
      } 
      set 
      { 
       Left = value; 
      } 
     } 

     public void ShowWindow() 
     { 
      Show(); 
     } 
    } 

然後改變你的參數IWindow這樣的:

private void SetMessagePosition(IWindow window, Controls.Button btn, string text)) 
     { 
+0

但IWindow如何與XAML相關?你需要改變窗口的屬性來調用 – windowskm

+0

。 – HichemSeeSharp

+0

在我必須做我的C#設計?我已經在XAML中完成了大部分工作。 – windowskm