WPF小笔记-Popup拖动

查看了下MSDN发现Popup没有类拟Drag相关的属性和方法,第一时间想了thumb。忙了一会未果,就想起了强大的google。

发现中文资料很少,英文的发现有两篇很不错的,所以笔记在博客园里,希望对园里的朋友有用。

social.msdm

stackoverflow

楼主推荐使用social.msdm的方法,试过很好用:

<Popup Name="puSkills" Placement="MousePoint" PopupAnimation="Scroll" AllowsTransparency="True" IsEnabled="True" IsOpen="False">
                        <Border BorderBrush="DarkCyan" BorderThickness="3">
                            <StackPanel Background="AliceBlue" VerticalAlignment="Center" Height="400" Width="400">
                                <Label Name="lblCaption"  FontWeight="Bold" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="Blue" Background="Blue" MouseLeftButtonDown="lblCaption_MouseLeftButtonDown">Move</Label>
                                <StackPanel>

                                  <TextBlock HorizontalAlignment="Right">
                                       Some Contents...........                                          
                                    </TextBlock>
                                </StackPanel>
                            </StackPanel>
                        </Border>
                    </Popup>

后台CS代码:

 [DllImport("user32.dll")]
        public static extern IntPtr WindowFromPoint(POINT Point);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetCursorPos(out POINT lpPoint);

        [DllImportAttribute("user32.dll")]
        public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        [DllImportAttribute("user32.dll")]
        public static extern bool ReleaseCapture();

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }

        public const int WM_NCLBUTTONDOWN = 0xA1;
        public const int HT_CAPTION = 0x2;

 private void lblCaption_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            POINT curPos;
            IntPtr hWndPopup;

            GetCursorPos(out curPos);
            hWndPopup = WindowFromPoint(curPos);

            ReleaseCapture();
            SendMessage(hWndPopup, WM_NCLBUTTONDOWN, new IntPtr(HT_CAPTION), IntPtr.Zero);
        }

Click the Move Content in label.. then move the mouse. Thank you!

posted @ 2013-07-11 10:47  Johnny Li  阅读(2756)  评论(0编辑  收藏  举报