2013-04-30 2 views
3

Я хочу создать объект WPF Thumb внутри обработчика события MouseDown. Пока пользователь удерживает мышь, они должны иметь возможность перетаскивать объект Thumb. Однако событие мыши не перенаправляется на мой новый объект Thumb. На самом деле, я сомневаюсь, что объект действительно создан до того, как текущий исполняемый поток имеет отсрочку. Как я могу запустить Thumb в режиме перетаскивания? Если я отправлю код по приоритету ввода, что я могу сделать, чтобы программно начать операцию перетаскивания на объект Thumb?создать большой палец в MouseDown и перетащить его?

+1

Насколько я знаю превью, они сами обнаруживают операцию перетаскивания, поэтому решение может состоять в том, чтобы держать палец невидимо на месте все время (охватывая всю «перетаскиваемую» клиентскую область) и только для обеспечения визуальной обратной связи когда он перетаскивается. Затем вы можете использовать события перетаскивания большого пальца, чтобы обнаружить это условие. – hbarck

ответ

4

Из-за недостатка кода Я предполагаю, что вы действительно имеете в виду «Создание объекта WPF Thumb внутри обработчика события MouseDown». Достаточно ли ниже?

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Canvas Name="RootCanvas" Background="White"/> 
</Window> 

public MainWindow() 
    { 
     InitializeComponent(); 
     RootCanvas.MouseDown += (s, e) => 
     { 
      Thumb thumb = new Thumb(); 
      thumb.Width = thumb.Height = 35; 
      thumb.Background = new SolidColorBrush(Colors.Red); 

      Canvas.SetLeft(thumb, e.GetPosition((Canvas)s).X - thumb.Width/2); 
      Canvas.SetTop(thumb, e.GetPosition((Canvas)s).Y - thumb.Height/2); 

      thumb.DragDelta += (d, r) => 
      { 
       Canvas.SetLeft((UIElement)d, Canvas.GetLeft((UIElement)d) + r.HorizontalChange); 
       Canvas.SetTop((UIElement)d, Canvas.GetTop((UIElement)d) + r.VerticalChange); 
      }; 

      ((Canvas)s).Children.Add(thumb); 
      Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => thumb.RaiseEvent(e))); 
     }; 
    } 

[EDIT]

Это 'почти' работает пример. По какой-то причине после первых thumb.DragDelta значения r.HorizontalChange и r.VerticalChange не являются дельтами мыши, а мышь delta минус текущее положение большого пальца, что имеет чистый эффект размещения большого пальца на (0,0) иш.

[EDIT2]

Обновлено для работы.

+0

Я ценю вас, отправляя пример кода. Однако сложной задачей, которую я ищу, является возможность перетащить объект Thumb без повторного нажатия. – Brannon

+0

Обновленный ответ с «почти» рабочим примером :) – StaWho

+0

Невозможно добавить текущее местоположение положения большого пальца в «r.HorizontalChange» и «r.VerticalChange» в первый раз, чтобы получить фактический 'большой палец. DragDelta'? – Stefan

Смежные вопросы