【问题标题】:How can I access one window's control (richtextbox) from another window in wpf?如何从 wpf 中的另一个窗口访问一个窗口的控件(富文本框)?
【发布时间】:2012-05-03 06:18:19
【问题描述】:

我确定这很简单,但我无法弄清楚。我在这里和 msdn 上搜索过,但一直找不到答案。我需要能够通过richtextbox.Selection.Select(TextPointer1, Textpointer2) 设置richtextboxes 选择。

【问题讨论】:

    标签: wpf richtextbox


    【解决方案1】:

    Application.Current 包含您应用程序中所有窗口的集合,您可以通过查询获取另一个窗口,例如

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

    然后您可以从代码中引用该控件,如

    var richText = window2.MyRichTextBox
    

    【讨论】:

      【解决方案2】:
      Application.Current.Windows.OfType(Of MainWindow).First
      

      【讨论】:

      • 在我看来,这是最好的答案。但是,如果有许多相同窗口的实例,而我不想要第一个,我如何获得我想要的实例?
      • 例如Application.Current.Windows.OfType().FirstOrDefault(x => x.Name == Name);
      【解决方案3】:

      如果你想要的话,你应该能够从后面的 Window2 代码访问 Window1 上的控件。生成的字段为internal by default

      您只需在 Window1 上为控件命名,如下所示:

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

      Window2后面的代码:

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

      【讨论】:

        【解决方案4】:

        您不能从另一个窗口访问 texbox,因为它是该窗口私有的,但是您可以通过将 RichTextBox 公开为窗口上的公共属性来解决此问题(hack)

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

        【讨论】:

        • 实际上,仅当窗口位于不同的程序集中时才需要此 hack,因为默认情况下字段访问是内部的,甚至可以使用 x:FieldModifier 属性进行更改。 MSDN:在使用 XAML、部分类和代码隐藏的 WPF 应用程序项目的标准构建配置下,指定的 x:Name 成为处理 XAML 时在基础代码中创建的字段的名称,并且该字段持有对该对象的引用。默认情况下,创建的字段是内部的。您可以通过指定 x:FieldModifier 属性来更改字段访问权限。
        • 我尝试将richtextbox x:FieldModifier 属性更改为public,但在第二个窗口中仍然看不到它。我可能做错了什么?我正在使用 Visual Studio 2010 beta 2 这会有什么不同吗?
        • 根据 x:Name 的 MSDN 信息,它也应该适用于 .NET 4.0。您确定您使用的是 window1 的实例而不是类名来访问控件吗?要获取 window 的实例,请查看 Ian 的答案。您可以发布访问richtextbox的代码吗?
        • 谢谢!我使用的是类名而不是实例。
        猜你喜欢
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多