2011-12-19 82 views
0

我在我的主窗口中有一個方法,我想在其他用戶控件中調用此方法。 我不使用靜態方法,因爲我的主窗口不是靜態的,我不能使它靜態。 所以我想出了使用這個,但我不知道什麼是背後的AS和我不知道我是否可以把一個方法是VAR? 我也不能做另一個MainWindow實例,因爲這給了我一個Stackoverflow異常。 我該如何解決這個問題?如何從MainWindow調用一個方法而不創建它的一個實例?

var myMethode= mainWindow.FindName("MyMethode") as (should be a methode); 
if (myMethode!= null) 
{ 
    //My code 
} 
+0

但該代碼將無法正常工作,因爲我無法使我的主窗口的實例,因爲StackOverFlow,所以必須有另一種選擇:) – Letoir 2011-12-19 08:49:04

+0

如果你的方法是因爲它使用MainWindow的字段,所以你必須創建一個實例。如果你的方法不使用MainWindow的字段或參數或...,爲什麼不使它成爲靜態的? – 2011-12-19 08:51:33

+0

@Martin因爲當我使它靜態它不會工作,它給了我一個錯誤,對非靜態字段,方法或屬性的abject引用是必需的? – Letoir 2011-12-19 08:52:06

回答

1

您可以在非靜態的類上定義靜態方法。

例如:

static void Main() 
{ 
    Foo foo = new Foo(); 
    Foo.DoSomething(); 
    foo.DoSomethingElse(); 
} 

public class Foo 
{ 
    public static void DoSomething() 
    { 
     Console.WriteLine("DoSomething"); 
    } 

    public void DoSomethingElse() 
    { 
     Console.WriteLine("DoSomethingElse"); 
    } 
} 

但不會是一個更好的解決方案,以通過MainWindow作爲參數到用戶控制?所以用戶控件知道它屬於哪個窗口並且可以訪問它的一個功能? (甚至可以更好地爲此聲明一個接口並傳遞接口)。

這看起來像:

public interface IWindow 
{ 
    string SomeWindowActivity(); 
} 

public class MyUserControl 
{ 
    public IWindow Window { get; set; } 

    public void SomeActionOnUserControl() 
    { 
     string data = Window.SomeWindowActivity(); 
    } 
} 

public class MainWindow : IWindow 
{ 
    MyUserControl MyUserControl { get; set; } 

    public MainWindow() 
    { 
     // Link the UserControl to the Window it's one. This can be done trough the 
     // constructor or a property 
     MyUserControl.Window = this; 
    } 

    public string SomeWindowActivity() 
    { 
     // Some code... 

     return "result"; 
    } 
} 
+0

我正在使用Kinect應用程序。而且Kinect的整個代碼都在MainWindow中,我不能將它放在其他用戶控件中,因爲我一直使用鼠標和skeltal跟蹤。 – Letoir 2011-12-19 08:56:35

+0

你是什麼意思將它作爲參數傳遞給你,你能告訴我一個例子嗎? – Letoir 2011-12-19 08:56:57

+0

當我使它靜態它不會工作,它給了我一個錯誤,對非靜態字段,方法或屬性的abject引用是必需的? – Letoir 2011-12-19 09:14:25

0

短unswer:你不能。你想調用一個實例方法,你需要有一個實例。

MainWindow不是靜態的這一事實並不妨礙您在其中定義靜態方法,只要這些方法不使用其他實例成員,那麼如果它是輔助方法,則可以將其定義爲靜態並調用其他實例成員那麼將它從MainWindow類重構出來可能是一個好主意。

如果它是一種非靜態方法,您聲稱不想創建MainWindow的第二個實例,爲什麼不在第一個實例上調用它,然後將其傳遞給您的控件?另外,如果創建MainWindow的另一個實例爲您提供stackoverflow,也許這是因爲您只是使用此方法進行了一些週期性調用,並且它可以被修復?

+0

我正在使用Kinect應用程序。而且Kinect的整個代碼都在MainWindow中,我不能將它放在其他用戶控件中,因爲我一直在使用鼠標和skeltal跟蹤,所以我無法重構?它一直在主窗口中使用。 – Letoir 2011-12-19 08:58:15

1

嘗試this

((MyMainWindow)Application.Current.MainWindow).Method() 

你不需要做主窗口單身,你的情況,你必須從Application.Current單

Application.Current.MainWindow 

希望訪問它這有助於

+0

所以這個我在我的UserControl中調用,重點是我有一個SettingsPage用戶控件,並且我想要顯示或隱藏一個畫布(這個畫布位於mainwindow上)。 在我的設置頁面中,我想說是向我展示畫布或不向我展示畫布。 – Letoir 2011-12-19 09:13:08

+0

好的,你可以在你的MainWindow中編寫一個方法ExpandConvas(bool isExpand),並從usercontrol((MyMainWindow)Application.Current.MainWindow).ExpandConvas(true) – 2011-12-19 09:17:53

+0

中調用該方法。但是,什麼是MyMainWindow?不能成爲一個實例嗎? – Letoir 2011-12-19 09:21:11

相關問題