2013-03-30 170 views
0

我有一個grid類和MainWindow類。 Grid的類函數需要調用主窗口的功能:調用其他類功能

// function from grid class: 
    public Point functionFromGridClass() 
    { 
     Point variable = MainWindow.functionFromMainWindowClass(0, 0); 
     // ... 
    } 
    // function from MainWindow class: 
    public static Point functionFromMainWindowClass(int x, int y) 
    { 
     Vector2 mouse; 
     mouse.X = x; 
     mouse.Y = y + (ClientRectangle.Height - glview.Size.Height); 
     // ... 
    } 

如果我刪除static關鍵字functionFromMainWindowClass,然後我不能從電網類調用它。如果我不刪除static關鍵字,那麼我不能使用MainWindow的類變量ClientRectangleglview,我會收到警告"An object reference is required for the non-static field, method, or property"。我從來沒有遇到這個問題,應該是什麼解決方案?

+0

我幾乎每天都遇到了這個問題,至少每隔一天,:)爲什麼不這樣做的計算器搜索? – David

+0

我搜索了但沒有找到,可能是因爲我不知道如何「命名」這個問題。 –

回答

2

網格類有舉行主窗口的實例的引用,並可能提供給在建設電網。

public class GridClass 
{ 
    private MainWindow window; 
    public GridClass(MainWindow Window) 
    { 
    window = Window; 
    } 
    public Point functionFromGridClass() 
    { 
    Point variable = window.functionFromMainWindowClass(0, 0); 
    } 
} 
+0

是的,這就是我想要的,非常感謝;)。 –

2

我得到「的對象引用需要非靜態字段,方法或屬性」

警告會告訴你怎麼做一個警告:你爲了調用需要一個實例實例方法。

所以,你可以從該方法去除static關鍵字,然後在網格類創建的MainWindow一個實例,以便能夠調用的方法:

var mainWindow = new MainWindow(); 
var result = mainWindow.functionFromMainWindowClass(5, 6); 
+0

不,如果我這樣做,那麼ClientRectangle和glview變量將不會與原來的MainWindow類相同(我真的不知道如何解釋)。 **我在問兩個類之間的通信** –

+0

您實際上沒有解釋「ClientRectangle」是什麼,所以很難提供幫助。但是你可以把這段代碼放在一個助手類中,當你需要調用這個方法時,你可以實例化這些類。或重用相同的實例。 –

0

很難不知道給出具體的建議到底發生了什麼,但總體情況是,您需要以某種方式獲取要調用該方法的MainWindow類的實例,或者通過將其傳入Grid中進行構造或類似操作,或者通過從某個資源中獲取它經理。

0

通過引用className來調用靜態方法。 叫你的主窗口類的功能是這樣的:

public Point functionFromGridClass() 
{ 
    MainWindowClass.functionFromMainWindowClass(val1, val2); 

}