Sono sicuro che questo è qualcosa di molto semplice ma non riesco a capirlo. Ho cercato qui e su msdn e non sono riuscito a trovare la risposta. Devo essere in grado di impostare la selezione di richtextboxes tramite richtextbox.Selection.Select (TextPointer1, Textpointer2).Come posso accedere al controllo di una finestra (richtextbox) da un'altra finestra in wpf?
risposta
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
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;
}
}
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);
Application.Current.Windows.OfType(Of MainWindow).First
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. –
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
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? –