9
votes

Comment puis-je accéder à la commande d'une fenêtre (RichTextBox) d'une autre fenêtre dans WPF?

Je suis sûr que c'est quelque chose de très simple mais je ne peux pas comprendre. J'ai cherché ici et sur MSDN et j'ai été incapable de trouver la réponse. J'ai besoin de pouvoir définir la sélection Richtextbox via Richtextbox.selection.Selection.Sélectionnez (TextPointer1, TextPointer2).


0 commentaires

4 Réponses :


2
votes

Vous ne pouvez pas accéder à la Texbox à partir d'une autre fenêtre car il est privé à cette fenêtre, vous pouvez cependant contourner cela en exposant la richtextbox en tant que propriété publique sur votre fenêtre (piratage) xxx


4 commentaires

En réalité, ce piratage ne serait nécessaire que si Windows est dans des assemblages différents, car l'accès au champ est interne par défaut, et même cela peut être modifié avec l'attribut X: FieldModifier. MSDN: Sous la configuration de construction standard pour un projet d'application WPF utilisant des classes XAML, des classes partielles et du code de code, le nom X: Nom spécifié devient le nom d'un champ créé dans le code sous-jacent lorsque XAML est traité et ce champ contient une référence à l'objet. Par défaut, le champ créé est interne. Vous pouvez modifier l'accès sur le terrain en spécifiant l'attribut X: FieldModifier.


J'ai essayé de changer l'attribut RichTextBox X: FieldModifier au public mais il n'est toujours pas visible de la deuxième fenêtre. Que pourrais-je faire de mal? J'utilise le studio Visual Studio 2010 Beta 2 cela ferait-il une différence?


Selon MSDN Info pour X: Nom, cela devrait fonctionner pour .NET 4.0 également. Êtes-vous sûr que vous utilisez une instance de fenêtre1 et non le nom de la classe pour accéder au contrôle? Pour obtenir l'instance de la fenêtre, regardez la réponse de Ian. Pouvez-vous publier le code que vous avez pour accéder à la RichTextBox?


Merci! J'utilisais le nom de la classe et non l'instance.



3
votes

Vous devriez être capable d'accéder à des contrôles sur window1 em> de window2 em> code derrière, si c'est ce que vous voulez. Les champs générés sont interne par défaut .

Tout ce dont vous avez besoin est Pour nommer la commande sur fenêtre1 em>, comme ceci: p> xxx pré>

in fenêtre2 em> code derrière: p>

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


0 commentaires

21
votes

application.current code> contient une collection de toutes les fenêtres de votre application, vous pouvez obtenir l'autre fenêtre avec une requête telle que

var richText = window2.MyRichTextBox


0 commentaires

6
votes
Application.Current.Windows.OfType(Of MainWindow).First

2 commentaires

À mon avis, c'est la meilleure réponse. Cependant, s'il y a beaucoup d'instances des mêmes fenêtres et que je ne veux pas le premier, comment puis-je obtenir l'instance que je veux?


par exemple. Application.Current.windows.oftype (). FirstOrdefault (x => x.name == Nom);