Набор инструментов Silverlight DragDrop для WPF - PullRequest
0 голосов
/ 16 января 2010

Предоставляет ли Microsoft на самом деле сборку Rx / Silverlight Toolkit DragDrop, которая "просто работает" на WPF?

Из того, что я могу сказать, материал Rx DragDrop доступен только в SL Toolkit (не WPF).

SL Toolkit, кажется, подразумевает, что вы можете использовать его в WPF (различные #defines), но не дает дополнительной информации о том, как это сделать.

Если я просто хочу что-то из DragDrop, легко ли его портировать на WPF, или 100-метровые линейки SL Toolkit идут вместе?

1 Ответ

0 голосов
/ 03 марта 2011

Я не могу комментировать слишком много в Silverlight Toolkit, но я могу прокомментировать Rx.

Reactive Extensions (Rx) - это набор библиотек общего назначения, позволяющий «поднимать» различные «push» коллекции (события, асинхронные операции и т. Д.) В первый класс с поддержкой LINQ. композиционные рамки. Он доступен для Silverlight, XNA и javascript, но что более важно для .NET 4.0 и .NET 3.5SP1, поэтому его можно использовать с WPF. (Реализация .NET 3.5SP1 даже переносит большую часть параллельной библиотеки задач, что может быть чрезвычайно полезно, даже если вы не используете основной код Rx.)

Тем не менее, поскольку Rx универсален, и если вы можете выполнять перетаскивание с использованием событий в WPF, то вы можете использовать Rx.

Запрос перетаскивания будет выглядеть примерно так:

var mouseDowns =
    Observable.FromEvent<MouseButtonEventArgs>(element, "MouseDown");

var mouseMoves =
    Observable.FromEvent<MouseEventArgs>(element, "MouseMove");

var mouseUps =
    Observable.FromEvent<MouseButtonEventArgs>(element, "MouseUp");

var mouseDragPoints =
    (from md in mouseDowns
        select (from mm in mouseMoves.TakeUntil(mouseUps)
                select mm.EventArgs.GetPosition(element))).Switch();

var mouseDragDeltas =
    mouseDragPoints.Skip(1).Zip(mouseDragPoints, (p1, p0) =>
        new Point(p1.X - p0.X, p1.Y - p0.Y));

Я быстро собрал этот код, не тестируя его, но он должен дать вам наблюдаемые дельты Point от исходной начальной точки перетаскивания, и это будет сделано только во время операции перетаскивания. Я пытался сохранить код простым. Вам нужно изменить для ваших конкретных потребностей.

Если Silverlight Toolkit предоставляет что-то еще, то это будет лишь относительно тонкий слой вспомогательных методов, которые вы можете либо заново изобрести, либо использовать Reflector.NET для извлечения и использования в своем приложении.

Надеюсь, это поможет.

...