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