Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭后,如何将可拖动wpf弹出窗口设置为其原始位置?_Wpf_Wpf Controls - Fatal编程技术网

关闭后,如何将可拖动wpf弹出窗口设置为其原始位置?

关闭后,如何将可拖动wpf弹出窗口设置为其原始位置?,wpf,wpf-controls,Wpf,Wpf Controls,我使用在堆栈溢出上找到的代码,使用附加的行为使WPF弹出窗口可拖动。此代码和行为按预期工作。弹出窗口将保持在其拖动位置,直到用户再次移动它 我现在要做的是,一旦关闭并重新打开,弹出窗口将显示在其原始放置目标位置。我如何完成这项任务 原职: Rick Sladkey编写的答案代码: 以下是弹出窗口的XAML: <Grid> <StackPanel> <TextBox x:Name="textBox1" Width="200" Height="20"

我使用在堆栈溢出上找到的代码,使用附加的行为使WPF弹出窗口可拖动。此代码和行为按预期工作。弹出窗口将保持在其拖动位置,直到用户再次移动它

我现在要做的是,一旦关闭并重新打开,弹出窗口将显示在其原始放置目标位置。我如何完成这项任务

原职:

Rick Sladkey编写的答案代码:

以下是弹出窗口的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>

示例弹出内容。
以下是他所写的附件:

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是在创建弹出窗口时设置的,所以我需要将此事件作为目标,以便弹出窗口知道它从何处开始。我编辑了答案以反映这一变化。非常感谢你的帮助。