| 
 使用WPF的Popup的时候会发现有一个问题,它总是会置顶,只要Popup的StayOpen不设置为False,它就一直呆在最顶端,挡住其他的窗口。  
解决方案是继承Popup重新定义控件PopupEx。  
   
public class PopupEx : Popup     {         public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(PopupEx ), new FrameworkPropertyMetadata(false, OnTopmostChanged));         public bool Topmost         {             get { return (bool)GetValue(TopmostProperty); }             set { SetValue(TopmostProperty, value); }         }         private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)         {             (obj as PopupEx ).UpdateWindow();         }         protected override void OnOpened(EventArgs e)         {             UpdateWindow();         }         private void UpdateWindow()         {             var hwnd = ((HwndSource)PresentationSource.FromVisual(this).Handle;             RECT rect;             if (GetWindowRect(hwnd, out rect))             {                 SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);             }         }         #region imports definitions         [StructLayout(LayoutKind.Sequential)]         public struct RECT         {             public int Left;             public int Top;             public int Right;             public int Bottom;         }         [DllImport("user32.dll")]         [return: MarshalAs(UnmanagedType.Bool)]         private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);         [DllImport("user32", EntryPoint = "SetWindowPos")]         private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);         #endregion     }  
   
然后在调用该控件的时候设置该PopupEx的属性 Topmost=False即可。  
   
还有一个Popup的问题,“在父窗口拖动的时候Popup不随着父窗口移动”的问题的解决方案我会在下一篇随笔中给出,敬请期待。  
转载时请注明文章来源:http://www.cnblogs.com/Leaco/p/3164394.html  |