【问题标题】:Call RichTextBox.ScrollToEnd() from View Model class从视图模型类调用 RichTextBox.ScrollToEnd()
【发布时间】:2011-02-10 16:54:24
【问题描述】:

您好,我尝试解决这个问题,在 WPF 中我使用 Caliburn Micro 框架。在 View 中我有可绑定的 Richtextbox 控件,我从 FlowDocument 的视图模型类属性类型中绑定。

我需要一种方法,如何在视图中的 Richetextbox 控件上调用方法 ScrollToEnd。

有可能吗?因为在视图模型类中我没有richtextbox 的实例。

感谢您的想法。

【问题讨论】:

    标签: wpf mvvm richtextbox scroll caliburn.micro


    【解决方案1】:

    一个类似的问题在这里提出了一个解决方案。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/67b618aa-f62e-43f8-966c-48057f4d4e0c

    【讨论】:

      【解决方案2】:

      有时从文件背后的代码调用 UI 代码是有意义的(如果其他解决方案使事情复杂化)。请记住:模式只是建议而不是脚本。甚至有人会争辩说,从视图模型中暴露FlowDocument 会使视图模型过于了解 UI。但你这样做是因为它更容易,对吧?

      如果您不想从后面的代码中进行此调用,这里有两种选择:

      • 考虑使用一个ScrollToEnd() 方法向视图模型注入一个接口。 View 实现了这个方法,并且视图模型在需要时调用它。
      • 从视图模型ScrollToEndRequested 中公开一个事件。 View 订阅此事件并在它被触发时采取相应的行动。

      其他选项(如附加行为)可能更合适,但它们确实取决于您的上下文。

      【讨论】:

      • 感谢反馈,解决方案可以在用户控件后面的代码中订阅 TextChanged,如果文本更改并且用户没有滚动richTextBox 类 ScrollToEnd。这是 mz 第一个大型 WPF 应用程序,我使用 caliburn 微框架,也许你知道。所以我尝试实现严格的 MVVM 设计,但对我来说现在还不可能。我查看了您的个人资料,您来自乌克兰?我来自斯洛伐克共和国。
      【解决方案3】:

      我提供了一个关于使用 Caliburns IResult here 将焦点设置到特定控件的问题的答案。您应该能够使用相同的概念来获取RichTextBox 以调用ScrollToEnd。我不会在这里重复整个解释,请转到那个问题以获取想法,但是下面的 IResult 实现(作为指导)应该会让你走上正轨。

      public class RichTextBoxScrollToEnd : ResultBase
      {
          public RichTextBoxScrollToEnd()
          {
      
          }
      
          public override void Execute(ActionExecutionContext context)
          {
              var view = context.View as UserControl;
      
              List<Control> richTextBoxes =
                  view.GetChildrenByType<Control>(c => c is RichTextBox);
      
              var richTextBox = richTextBoxes.FirstOrDefault();
      
              if (richTextBox != null)
                  richTextBox.Dispatcher.BeginInvoke(() =>
              {
                  richTextBox.ScrollToEnd();
              });
      
              RaiseCompletedEvent();
          }
      }
      

      如果您的视图中有多个RichTextBoxes,您可以向RichTextBoxScrollToEnd 的构造函数提供一个参数,这是您要定位的特定控件的名称,然后使用该名称过滤richTextBoxes,即

      var richTextBox = richTextBoxes.FirstOrDefault(c => c.Name == _nameOfControl);
      

      有关更多详细信息,请参阅参考问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-02
        • 2016-07-02
        • 2016-09-27
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多