1

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

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

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

感谢您的想法。

4

3 回答 3

1

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

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

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

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

于 2011-02-10T17:20:39.633 回答
1

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

于 2011-02-10T17:09:19.367 回答
0

IResult 我在此处提供了有关使用 Caliburns 将焦点设置到特定控件的问题的答案。您应该能够使用相同的概念来获取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);

不过,请参阅引用的问题以获取更多详细信息。

于 2011-02-11T07:35:13.483 回答