Чтение пробела в стиле Outlook с WPF и MVVM - PullRequest
2 голосов
/ 24 июня 2011

Одной из замечательных особенностей Microsoft Outlook является режим чтения пробела (с включенной панелью чтения). Скажем, в вашем почтовом ящике 5 сообщений, и отображается первое. Отображаемое сообщение не полностью умещается на экране, поэтому при нажатии пробела это похоже на просмотр страницы в сообщении. Вы снова нажмете пробел, и он снова опустится. Когда вы дойдете до нижней части страницы и снова нажмете пробел, он перейдет к следующему сообщению.

Каков хороший способ сделать это в WPF (где приложение создается с использованием шаблона MVVM)? С MVVM я использую кучу DataTemplates вместо usercontrols.

Редактировать: я должен упомянуть, что я использую ListBox для сообщений и FlowDocumentScrollViewer для тела сообщения.

Ответы [ 2 ]

0 голосов
/ 27 июня 2011

Для потомков, вот мое решение прокручиваемой части вопроса.Этот код сначала обрабатывает пробел, затем, если полоса прокрутки уже находится внизу, он не обрабатывает KeyDown.Рекомендованный @ Хасан рекомендует пожары в этот момент.

internal class FlowDocumentScrollViewer2 : FlowDocumentScrollViewer
{
  private static bool PageDown<T>(T listView)
     where T : DependencyObject
  {
     var scrollViewer = GetVisualChild<ScrollViewer>(listView, null);
     var scrollBar = GetVisualChild<ScrollBar>(listView,
                                               bar => bar.Orientation == Orientation.Vertical);
     var formerOffset = scrollBar.Track.Value;
     scrollViewer.PageDown();
     scrollBar.Track.UpdateLayout();
     return formerOffset < scrollBar.Track.Value;
  }

  private static T GetVisualChild<T>(DependencyObject parent, Predicate<T> predicate)
     where T : Visual
  {
     T child = default(T);
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
     for (int i = 0; i < numVisuals; i++)
     {
        Visual v = (Visual) VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
           child = GetVisualChild(v, predicate);
        }
        if (child != null && (predicate == null || predicate(child)))
        {
           break;
        }
     }
     return child;
  }

  public FlowDocumentScrollViewer2()
  {
     PreviewKeyDown += PreviewSpaceDown;
  }

  private void PreviewSpaceDown(object sender, KeyEventArgs e)
  {
     if (e.Handled)
        return;
     if (e.Key == Key.Space)
     {
        e.Handled = PageDown(this);
     }
  }
}
0 голосов
/ 24 июня 2011

Используйте KeyTrigger Expression Blend для вызова Команды в вашей модели представления

http://msdn.microsoft.com/en-us/library/microsoft.expression.interactivity.input.keytrigger%28v=expression.40%29.aspx

ИЛИ

Использование CommandReference из MVVM Toolkit Как связатьнажатие клавиши с делегатной командой в составном WPF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...