Вызов RichTextBox.ScrollToEnd () из класса View Model - PullRequest
1 голос
/ 10 февраля 2011

Привет, я пытаюсь решить эту проблему, в WPF я использую Caliburn Micro Framework.В View у меня есть привязываемый элемент управления richtextbox, я связываю из вида модель свойства класса FlowDocument.

Мне нужен способ, как я могу вызвать метод ScrollToEnd для элемента управления richetextbox в представлении.

Это так?возможный?Потому что в классе модели представления у меня нет экземпляра richtextbox.

Спасибо за idead.

Ответы [ 3 ]

1 голос
/ 10 февраля 2011

Иногда имеет смысл вызывать код пользовательского интерфейса из кода, стоящего за файлом (если другие решения усложняют ситуацию). Помните: шаблоны - это просто рекомендации, а не сценарий. Можно даже утверждать, что экспонирование FlowDocument из модели представления делает модель представления слишком осведомленной об UI. Но ты сделал это, потому что это было проще, верно?

Если вы не хотите делать этот вызов из-за кода, есть два варианта:

  • Рассмотрите возможность внедрения интерфейса в модель представления одним методом ScrollToEnd(). Представление реализует этот метод, и модель представления вызывает его всякий раз, когда он чувствует необходимость.
  • Выставить событие из представления модели ScrollToEndRequested. View подписывается на это событие и действует соответственно, когда его запускают.

Другие варианты (например, прикрепленное поведение) могут быть более подходящими, но они действительно зависят от вашего контекста.

1 голос
/ 10 февраля 2011

Аналогичный вопрос задается здесь с решением. http://social.msdn.microsoft.com/Forums/en/wpf/thread/67b618aa-f62e-43f8-966c-48057f4d4e0c

0 голосов
/ 11 февраля 2011

Я дал ответ на вопрос об установке фокуса на конкретный элемент управления с помощью Caliburns IResult здесь . Вы должны иметь возможность использовать ту же концепцию, чтобы овладеть 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);

См. Упомянутый вопрос для более подробной информации.

...