2013-01-17 17 views
2

我使用Stack Overflow上的代碼來使用附加的行爲來使WPF彈出窗口可拖動。此代碼和行爲按預期工作。彈出窗口將保持拖動位置,直到用戶再次移動它。關閉後,如何將可拖動的wpf彈出框設置爲原始位置?

我現在想要做的是讓彈出窗口出現在原來的放置目標位置,一旦它關閉並重新打開。我如何完成這項任務?

原帖:由Rick Sladkey書面A draggable popup control in wpf

答案代碼:https://stackoverflow.com/a/4784977/1286413

下面是彈出的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> 

這是他寫的AttachedBehavior:

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(); 
     }; 
    } 
} 

在此先感謝幫助!

回答

1

在OnAttached中,添加一個處理程序給Closed,它將保存彈出窗口的位置,另一個處理程序打開,將彈出窗口移回到該位置。

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

    private bool useSavedPosition; 
    private Point savedPosition; 

    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(); 
     }; 

     AssociatedObject.Opened += (s, e) => 
     { 
      if (!useSavedPosition) return; 
      AssociatedObject.HorizontalOffset = savedPosition.X; 
      AssociatedObject.VerticalOffset = savedPosition.Y; 
     }; 

     AssociatedObject.Loaded += (s, e) => 
     { 
      savedPosition = new Point(AssociatedObject.HorizontalOffset, AssociatedObject.VerticalOffset); 
      useSavedPosition = true; 
     }; 
    } 
} 
+1

提供的代碼有一個修改:我將AssociatedObject.Closed更改爲AssociatedObject.Loaded。由於PlacementTarget是在創建彈出窗口時設置的,因此我需要定位此事件,以便彈出窗口知道它開始的位置。我編輯了答案以反映這一變化。非常感謝您的幫助。 –

相關問題