关闭后,如何将可拖动wpf弹出窗口设置为其原始位置?
我使用在堆栈溢出上找到的代码,使用附加的行为使WPF弹出窗口可拖动。此代码和行为按预期工作。弹出窗口将保持在其拖动位置,直到用户再次移动它 我现在要做的是,一旦关闭并重新打开,弹出窗口将显示在其原始放置目标位置。我如何完成这项任务 原职: Rick Sladkey编写的答案代码: 以下是弹出窗口的XAML:关闭后,如何将可拖动wpf弹出窗口设置为其原始位置?,wpf,wpf-controls,Wpf,Wpf Controls,我使用在堆栈溢出上找到的代码,使用附加的行为使WPF弹出窗口可拖动。此代码和行为按预期工作。弹出窗口将保持在其拖动位置,直到用户再次移动它 我现在要做的是,一旦关闭并重新打开,弹出窗口将显示在其原始放置目标位置。我如何完成这项任务 原职: Rick Sladkey编写的答案代码: 以下是弹出窗口的XAML: <Grid> <StackPanel> <TextBox x:Name="textBox1" Width="200" Height="20"
<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>
示例弹出内容。
以下是他所写的附件:
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();
};
}
}
public类mousedragpopubbehavior:行为
{
私人布尔·穆斯敦;
私密点鼠标定位;
受保护的覆盖无效附加()
{
AssociatedObject.MouseLeftButtonDown+=(s,e)=>
{
mouseDown=true;
oldMousePosition=AssociatedObject.PointToScreen(例如GetPosition(AssociatedObject));
AssociatedObject.Child.CaptureMouse();
};
AssociatedObject.MouseMove+=(s,e)=>
{
如果(!mouseDown)返回;
var newMousePosition=AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
var偏移=新鼠标位置-旧鼠标位置;
oldMousePosition=newMousePosition;
AssociatedObject.HorizontalOffset+=offset.X;
AssociatedObject.VerticalOffset+=offset.Y;
};
AssociatedObject.MouseLeftButtonUp+=(s,e)=>
{
mouseDown=false;
AssociatedObject.Child.ReleaseMouseCapture();
};
}
}
提前感谢您的帮助 在OnAttached中,将一个处理程序添加到Closed以保存弹出窗口的位置,并将另一个处理程序添加到Open以将弹出窗口移回该位置
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;
};
}
}
public类mousedragpopubbehavior:行为
{
私人布尔·穆斯敦;
私密点鼠标定位;
私人住宅使用保存位置;
私人点存储位置;
受保护的覆盖无效附加()
{
AssociatedObject.MouseLeftButtonDown+=(s,e)=>
{
mouseDown=true;
oldMousePosition=AssociatedObject.PointToScreen(例如GetPosition(AssociatedObject));
AssociatedObject.Child.CaptureMouse();
};
AssociatedObject.MouseMove+=(s,e)=>
{
如果(!mouseDown)返回;
var newMousePosition=AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
var偏移=新鼠标位置-旧鼠标位置;
oldMousePosition=newMousePosition;
AssociatedObject.HorizontalOffset+=offset.X;
AssociatedObject.VerticalOffset+=offset.Y;
};
AssociatedObject.MouseLeftButtonUp+=(s,e)=>
{
mouseDown=false;
AssociatedObject.Child.ReleaseMouseCapture();
};
关联对象。已打开+=(s,e)=>
{
如果(!useSavedPosition)返回;
AssociatedObject.HorizontalOffset=savedPosition.X;
AssociatedObject.VerticalOffset=savedPosition.Y;
};
AssociatedObject.Loaded+=(s,e)=>
{
savedPosition=新点(AssociatedObject.HorizontalOffset、AssociatedObject.VerticalOffset);
useSavedPosition=true;
};
}
}
提供的代码只做了一次修改:我将AssociatedObject.Closed更改为AssociatedObject.Loaded。因为PlacementTarget是在创建弹出窗口时设置的,所以我需要将此事件作为目标,以便弹出窗口知道它从何处开始。我编辑了答案以反映这一变化。非常感谢你的帮助。