嗨,我尝试解决这个问题,在 WPF 中我使用 Caliburn Micro 框架。在视图中,我有可绑定的 Richtextbox 控件,我从 FlowDocument 的视图模型类属性类型中绑定。
我需要一种方法,如何在视图中的 Richetextbox 控件上调用方法 ScrollToEnd。
可能吗?因为在视图模型类中我没有richtextbox 的实例。
感谢您的想法。
嗨,我尝试解决这个问题,在 WPF 中我使用 Caliburn Micro 框架。在视图中,我有可绑定的 Richtextbox 控件,我从 FlowDocument 的视图模型类属性类型中绑定。
我需要一种方法,如何在视图中的 Richetextbox 控件上调用方法 ScrollToEnd。
可能吗?因为在视图模型类中我没有richtextbox 的实例。
感谢您的想法。
有时从文件后面的代码中调用 UI 代码是有意义的(如果其他解决方案使事情复杂化)。请记住:模式只是建议而不是脚本。甚至有人会争辩说,FlowDocument
从视图模型中公开一个视图模型会使视图模型过于了解 UI。但你这样做是因为它更容易,对吧?
如果您不想从后面的代码中进行此调用,这里有两个选项:
ScrollToEnd()
。View 实现了这个方法,并且视图模型在需要时调用它。ScrollToEndRequested
。View 订阅此事件并在它被触发时采取相应的行动。其他选项(如附加行为)可能更合适,但它们实际上取决于您的上下文。
一个类似的问题在这里提出了一个解决方案。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/67b618aa-f62e-43f8-966c-48057f4d4e0c
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);
不过,请参阅引用的问题以获取更多详细信息。