2010-02-08 30 views

Respuesta

14

Application.Current contiene una colección de todas las ventanas en que la aplicación, se puede conseguir que la otra ventana con una consulta como

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

y luego se puede hacer referencia al control de su código, como en

var richText = window2.MyRichTextBox 
2

Usted no puede acceder a la TexBox de otra ventana, ya que es privado para esa ventana sin embargo se puede evitar esto, se exponen RichTextBox como una propiedad pública en su ventana (truco)

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

en realidad, sólo se necesita este hack si las ventanas están en diferentes montajes, ya que el acceso de campo es interno por defecto, e incluso eso se puede cambiar con el atributo x: FieldModifier. MSDN: Bajo la configuración de compilación estándar para un proyecto de aplicación WPF que usa XAML, clases parciales y código subyacente, el x: Name especificado se convierte en el nombre de un campo creado en el código subyacente cuando se procesa XAML , y ese campo contiene una referencia al objeto. De forma predeterminada, el campo creado es interno. Puede cambiar el acceso al campo especificando el atributo x: FieldModifier. –

+0

He intentado cambiar el atributo richtextbox x: FieldModifier por public pero todavía no está visible desde la segunda ventana. ¿Qué podría estar haciendo mal? Estoy usando Visual Studio 2010 beta 2 ¿Esto marcaría la diferencia? – Justin

+0

Según la información de MSDN para x: Name, también debería funcionar para .NET 4.0. ¿Estás seguro de que estás utilizando la instancia de window1 y no el nombre de la clase para acceder al control? Para obtener la instancia de ventana, mira la respuesta de Ian. ¿Puedes publicar el código que tienes para acceder al richtextbox? –

1

Usted debe ser capaz para acceder a los controles en Ventana1 desde código de Window2 atrás, si eso es lo que desea. Los campos generados son internal by default.

Todo lo que necesita es un nombre al control de Window1, así:

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

En Window2 código detrás:

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

Una mejor opción sería la de encapsular operación de selección en un método en el código detrás de Window1, para evitar regalar interno. De allí tendría que tener:

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