2010-02-08 60 views

回答

14

Application.Current包含在你的應用程序的所有窗口的集合,你可以用一個查詢,如

var window2 = Application.Current.Windows 
    .Cast<Window>() 
    .FirstOrDefault(window => window is Window2) as Window2; 

其他窗口,然後你可以從引用控制你的代碼,如

var richText = window2.MyRichTextBox 
2

你不能從另一個窗口訪問texbox,因爲它是專用於該窗口中,您可以通過暴露在RichTextBox作爲公共財產的窗口(破解版),但是解決這個

public RichTextBox RichTextBox { 
    get{ 
    //the RichTextBox would have a property x:Name="richTextbox" in the xaml 
    return richTextBox; 
    } 
} 
+1

實際上,只會如果Windows是在不同的組件需要這個技巧,因爲默認情況下字段訪問是內部的,甚至可以使用x:FieldModifier屬性來更改。 MSDN: 在使用XAML,部分類和代碼隱藏的WPF應用程序項目的標準構建配置下,指定的x:Name將成爲在處理XAML時在基礎代碼中創建的字段的名稱,並且該字段擁有對該對象的引用。 默認情況下,創建的字段是內部的。您可以通過指定x:FieldModifier屬性來更改字段訪問權限。 – 2010-02-08 02:04:08

+0

我已經嘗試將richtextbox x:FieldModifier屬性更改爲public,但它仍然不可見於第二個窗口。我可能做錯了什麼?我正在使用visual studio 2010 beta 2,這會有什麼不同? – Justin 2010-02-08 02:25:29

+0

根據x:Name的MSDN信息,它也適用於.NET 4.0。你確定使用window1的實例而不是類名來訪問控件嗎?爲了獲得窗口的實例,請看Ian的答案。 您可以發佈您訪問richtextbox的代碼嗎? – 2010-02-08 02:40:46

1

你應該能夠訪問控制Window1 from Window2後面的代碼,如果這就是你想要的。生成的字段是internal by default

所有你需要的是命名上控制窗口1,像這樣:

<RichTextBox x:Name="richtextbox" ... /> 

窗口2後面的代碼:

var window = new Window1(); // or use the existing instance of Window1 
window.richtextbox.Selection.Select(TextPointer1, Textpointer2); 

一個更好的選擇將是封裝選擇操作在Window1後面的代碼中,避免泄露內部。然後,你將有:

// Window1.cs 
public void Select(int param1, int param2) 
{ 
    richtextbox.Selection.Select(param1, param2); 
} 

// Window2.cs 
var window = new Window1(); // or use the existing instance of Window1 
window.Select(TextPointer1, Textpointer2); 
5
Application.Current.Windows.OfType(Of MainWindow).First 
相關問題