2010-02-08 6 views

risposta

14

Application.Current contiene una raccolta di tutte le finestre in voi l'applicazione, è possibile ottenere l'altra finestra con una query come

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

e quindi è possibile fare riferimento il controllo dalla codice, come in

var richText = window2.MyRichTextBox 
2

Non puoi accedere al texbox da un'altra finestra in quanto è privato a quella finestra ma si può ovviare a questo, esponendo il RichTextBox come una proprietà pubblica sul tuo finestra (mod)

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

in realtà, questo hack sarebbe necessaria solo se le finestre sono in diversi assiemi, poiché l'accesso al campo è interno per impostazione predefinita e anche quello può essere modificato con l'attributo x: FieldModifier. MSDN: MSDN: Sotto la configurazione di generazione standard per un progetto di applicazione WPF che utilizza XAML, classi parziali e code-behind, il x: Name specificato diventa il nome di un campo che viene creato nel codice sottostante quando XAML viene elaborato e quel campo contiene un riferimento all'oggetto. Per impostazione predefinita, il campo creato è interno. È possibile modificare l'accesso al campo specificando l'attributo x: FieldModifier. –

+0

Ho provato a cambiare l'attributo richtextbox x: FieldModifier in pubblico ma non è ancora visibile dalla seconda finestra. Cosa potrei fare di sbagliato? Sto usando lo studio visivo 2010 beta 2 farebbe qualche differenza? – Justin

+0

In base alle informazioni MSDN per x: Name, dovrebbe funzionare anche per .NET 4.0. Sei sicuro di utilizzare l'istanza di window1 e non il nome della classe per accedere al controllo? Per ottenere l'istanza della finestra, guarda la risposta di Ian. Puoi pubblicare il codice che hai per accedere a richtextbox? –

1

Dovreste essere in grado per accedere ai controlli su Window1 dal codice Window2 dietro, se è ciò che si desidera. I campi generati sono internal by default.

Tutto ciò che serve è dare un nome al controllo Window1, in questo modo:

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

In Window2 codice dietro:

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

Una soluzione migliore sarebbe quella di incapsulare operazione di selezione in un metodo nel codice dietro a Window1, per evitare di dare via interna. Poi si avrebbe:

// 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