2011-01-24 2 views
4

мне нужно перемещаемой контроль всплывающий в МОФ и был интересно, если любой из ваших ребят мог бы помочь мне out..I был увидеть следующее сообщение:перетаскиваемого управлению всплывающего окна в МОФ

Drag WPF Popup control

но что Isnt как он должен работать ...? Когда я нажимаю и перетаскиваю его, он всегда сбрасывается до определенной точки, и, кроме того, комментаторы говорят, что это не эффективный подход ...? Есть ли у кого-нибудь альтернативы?

Спасибо!

+0

как говорит связанный вопрос, вы, вероятно, следует использовать Thumb вместо всплывающего окна –

+0

Может с помощью большого пальца переместить всплывающее окно, когда мышь перемещается ...? Я так не думаю ... насколько я знаю ...? у вас есть пример того, как мы можем использовать большой палец для перетаскивания? благодаря! извините, я новичок в wpf ... так что если мои вопросы кажутся глупыми. Я извиняюсь. :) – Dan

ответ

0

Вы можете открыть дочернее окно с пользовательской рамкой. Затем добавьте обработчик MouseDown, который позволяет увлекая:

<Window 
     WindowStyle="None" 
     ShowInTaskbar="False" 
     ResizeMode="NoResize" 
     SizeToContent="Height" 
     MouseDown="Window_MouseDown"> 
... 
</Window> 

В коде позади:

private void Window_MouseDown(Object sender, MouseButtonEventArgs e) 
    { 
     this.DragMove(); 
    } 
+0

Спасибо matthias ... хорошее предложение ... если я не могу получить всплывающее окно, чтобы перетащить, то плохо используйте свое решение, я думаю. – Dan

+0

Как установить положение окна относительно определенного элемента управления и разрешить его перетаскивание только в пределах других окон? – Dan

+0

Позиционирование окна должно быть возможным, установив Window.Left и Window.Top после определения позиции с помощью PointToScreen (...). Я не знаю, как закрепить его в другом окне. –

15

Мы можем написать поведение, чтобы сделать любой из Popup перетаскиваемый. Вот некоторые примеры XAML из всплывающего окна, связанное с текстовым полем, который открывается и остается открытым, когда текстовое поле сфокусировано:

<Grid> 
    <StackPanel> 
     <TextBox x:Name="textBox1" Width="200" Height="20"/> 
    </StackPanel> 
    <Popup PlacementTarget="{Binding ElementName=textBox1}" IsOpen="{Binding IsKeyboardFocused, ElementName=textBox1, Mode=OneWay}"> 
     <i:Interaction.Behaviors> 
      <local:MouseDragPopupBehavior/> 
     </i:Interaction.Behaviors> 
     <TextBlock Background="White"> 
      <TextBlock.Text>Sample Popup content.</TextBlock.Text> 
     </TextBlock> 
    </Popup> 
</Grid> 

Вот поведение, которое позволяет перетаскивать Popup:

public class MouseDragPopupBehavior : Behavior<Popup> 
{ 
    private bool mouseDown; 
    private Point oldMousePosition; 

    protected override void OnAttached() 
    { 
     AssociatedObject.MouseLeftButtonDown += (s, e) => 
     { 
      mouseDown = true; 
      oldMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject)); 
      AssociatedObject.Child.CaptureMouse(); 
     }; 
     AssociatedObject.MouseMove += (s, e) => 
     { 
      if (!mouseDown) return; 
      var newMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject)); 
      var offset = newMousePosition - oldMousePosition; 
      oldMousePosition = newMousePosition; 
      AssociatedObject.HorizontalOffset += offset.X; 
      AssociatedObject.VerticalOffset += offset.Y; 
     }; 
     AssociatedObject.MouseLeftButtonUp += (s, e) => 
     { 
      mouseDown = false; 
      AssociatedObject.Child.ReleaseMouseCapture(); 
     }; 
    } 
} 

Если вы не знакомы с поведением, установите Expression Blend 4 SDK и добавить пространство имен:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

и добавить System.Windows.Interactivity в свой проект ,

+0

Это прямое упражнение, чтобы вместо этого использовать функцию вместо кода. Просто добавьте обработчики и измените AssociatedObject на popup1. –

+0

oh ok cool ... Так что мне просто нужно заменить поведение связанными событиями mouseup mousedown в коде позади? (заменив AssociatedObject на popup1) Спасибо! – Dan

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