精华内容
下载资源
问答
  • 想通过鼠标的拖曳,在数据窗口中任意移动控件的位置如何能实现,请详细说明,谢谢
  • 如题我的带滚动条的窗口作为父窗口(叫A窗口吧),需要移动A窗口里的子窗口的位置. 但是用MoveWindow和SetWindowPos呢, 比如说A窗口里有32个子窗口, 删掉中间位置的一个子窗口,那么就需要把删掉的窗口后边的窗口往前...
  • 原文:解决 Popup 位置不随窗口移动更新的问题Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位置不会更新。 如何更新位置? 获取当前Popup的Target绑定UserControl所在...
    原文:解决 Popup 位置不随窗口移动更新的问题

    Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位置不会更新。

    如何更新位置?

    获取当前Popup的Target绑定UserControl所在窗口,位置刷新时,时时更新Popup的位置即可。

    1.添加一个附加属性

    1 /// <summary>
    2 /// Popup位置更新
    3 /// </summary>
    4 public static readonly DependencyProperty PopupPlacementTargetProperty =
    5     DependencyProperty.RegisterAttached("PopupPlacementTarget", typeof(DependencyObject), typeof(PopupHelper), new PropertyMetadata(null, OnPopupPlacementTargetChanged));

     

    2.窗口移动后触发popup更新

    首先,有个疑问,popup首次显示时,为何显示的位置是正确的呢?

    通过查看源码,发现,其实popup也是有内置更新popup位置的!

    而通过查看UpdatePosition代码,其方法确实是更新popup位置的。源码如下:

      1 private void UpdatePosition()
      2 {
      3     if (this._popupRoot.Value == null)
      4         return;
      5     PlacementMode placement = this.Placement;
      6     Point[] targetInterestPoints = this.GetPlacementTargetInterestPoints(placement);
      7     Point[] childInterestPoints = this.GetChildInterestPoints(placement);
      8     Rect bounds = this.GetBounds(targetInterestPoints);
      9     Rect rect1 = this.GetBounds(childInterestPoints);
     10     double num1 = rect1.Width * rect1.Height;
     11     int num2 = -1;
     12     Vector offsetVector1 = new Vector((double)this._positionInfo.X, (double)this._positionInfo.Y);
     13     double num3 = -1.0;
     14     PopupPrimaryAxis popupPrimaryAxis = PopupPrimaryAxis.None;
     15     CustomPopupPlacement[] customPopupPlacementArray = (CustomPopupPlacement[])null;
     16     int num4;
     17     if (placement == PlacementMode.Custom)
     18     {
     19         CustomPopupPlacementCallback placementCallback = this.CustomPopupPlacementCallback;
     20         if (placementCallback != null)
     21             customPopupPlacementArray = placementCallback(rect1.Size, bounds.Size, new Point(this.HorizontalOffset, this.VerticalOffset));
     22         num4 = customPopupPlacementArray == null ? 0 : customPopupPlacementArray.Length;
     23         if (!this.IsOpen)
     24             return;
     25     }
     26     else
     27         num4 = Popup.GetNumberOfCombinations(placement);
     28     for (int i = 0; i < num4; ++i)
     29     {
     30         bool flag1 = false;
     31         bool flag2 = false;
     32         Vector offsetVector2;
     33         PopupPrimaryAxis axis;
     34         if (placement == PlacementMode.Custom)
     35         {
     36             offsetVector2 = (Vector)targetInterestPoints[0] + (Vector)customPopupPlacementArray[i].Point;
     37             axis = customPopupPlacementArray[i].PrimaryAxis;
     38         }
     39         else
     40         {
     41             Popup.PointCombination pointCombination = this.GetPointCombination(placement, i, out axis);
     42             Popup.InterestPoint targetInterestPoint = pointCombination.TargetInterestPoint;
     43             Popup.InterestPoint childInterestPoint = pointCombination.ChildInterestPoint;
     44             offsetVector2 = targetInterestPoints[(int)targetInterestPoint] - childInterestPoints[(int)childInterestPoint];
     45             flag1 = childInterestPoint == Popup.InterestPoint.TopRight || childInterestPoint == Popup.InterestPoint.BottomRight;
     46             flag2 = childInterestPoint == Popup.InterestPoint.BottomLeft || childInterestPoint == Popup.InterestPoint.BottomRight;
     47         }
     48         Rect rect2 = Rect.Offset(rect1, offsetVector2);
     49         Rect rect3 = Rect.Intersect(this.GetScreenBounds(bounds, targetInterestPoints[0]), rect2);
     50         double num5 = rect3 != Rect.Empty ? rect3.Width * rect3.Height : 0.0;
     51         if (num5 - num3 > 0.01)
     52         {
     53             num2 = i;
     54             offsetVector1 = offsetVector2;
     55             num3 = num5;
     56             popupPrimaryAxis = axis;
     57             this.AnimateFromRight = flag1;
     58             this.AnimateFromBottom = flag2;
     59             if (Math.Abs(num5 - num1) < 0.01)
     60                 break;
     61         }
     62     }
     63     if (num2 >= 2 && (placement == PlacementMode.Right || placement == PlacementMode.Left))
     64         this.DropOpposite = !this.DropOpposite;
     65     rect1 = new Rect((Size)this._secHelper.GetTransformToDevice().Transform((Point)this._popupRoot.Value.RenderSize));
     66     rect1.Offset(offsetVector1);
     67     Rect screenBounds = this.GetScreenBounds(bounds, targetInterestPoints[0]);
     68     Rect rect4 = Rect.Intersect(screenBounds, rect1);
     69     if (Math.Abs(rect4.Width - rect1.Width) > 0.01 || Math.Abs(rect4.Height - rect1.Height) > 0.01)
     70     {
     71         Point point1 = targetInterestPoints[0];
     72         Vector vector1 = targetInterestPoints[1] - point1;
     73         vector1.Normalize();
     74         if (!this.IsTransparent || double.IsNaN(vector1.Y) || Math.Abs(vector1.Y) < 0.01)
     75         {
     76             if (rect1.Right > screenBounds.Right)
     77                 offsetVector1.X = screenBounds.Right - rect1.Width;
     78             else if (rect1.Left < screenBounds.Left)
     79                 offsetVector1.X = screenBounds.Left;
     80         }
     81         else if (this.IsTransparent && Math.Abs(vector1.X) < 0.01)
     82         {
     83             if (rect1.Bottom > screenBounds.Bottom)
     84                 offsetVector1.Y = screenBounds.Bottom - rect1.Height;
     85             else if (rect1.Top < screenBounds.Top)
     86                 offsetVector1.Y = screenBounds.Top;
     87         }
     88         Point point2 = targetInterestPoints[2];
     89         Vector vector2 = point1 - point2;
     90         vector2.Normalize();
     91         if (!this.IsTransparent || double.IsNaN(vector2.X) || Math.Abs(vector2.X) < 0.01)
     92         {
     93             if (rect1.Bottom > screenBounds.Bottom)
     94                 offsetVector1.Y = screenBounds.Bottom - rect1.Height;
     95             else if (rect1.Top < screenBounds.Top)
     96                 offsetVector1.Y = screenBounds.Top;
     97         }
     98         else if (this.IsTransparent && Math.Abs(vector2.Y) < 0.01)
     99         {
    100             if (rect1.Right > screenBounds.Right)
    101                 offsetVector1.X = screenBounds.Right - rect1.Width;
    102             else if (rect1.Left < screenBounds.Left)
    103                 offsetVector1.X = screenBounds.Left;
    104         }
    105     }
    106     int x = DoubleUtil.DoubleToInt(offsetVector1.X);
    107     int y = DoubleUtil.DoubleToInt(offsetVector1.Y);
    108     if (x == this._positionInfo.X && y == this._positionInfo.Y)
    109         return;
    110     this._positionInfo.X = x;
    111     this._positionInfo.Y = y;
    112     this._secHelper.SetPopupPos(true, x, y, false, 0, 0);
    113 }
    View Code

     

    那么,我们有什么办法调用这个私有方法呢?我相信大家都想,找到popup源码开发者,爆了他Y的!

    有一种方法,叫反射,反射可以获取类的任一个字段或者属性。

    反射,可以参考:https://www.cnblogs.com/vaevvaev/p/6995639.html

    通过反射,我们获取到UpdatePosition方法,并调用执行。

    1 var mi = typeof(Popup).GetMethod("UpdatePosition", BindingFlags.NonPublic | BindingFlags.Instance);
    2 mi.Invoke(pop, null);

     

    下面是详细的属性更改事件实现:

     1 private static void OnPopupPlacementTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     2 {
     3     Popup pop = d as Popup;
     4 
     5     //旧值取消LocationChanged监听
     6     if (e.OldValue is DependencyObject previousPlacementTarget)
     7     {
     8         Window window = Window.GetWindow(previousPlacementTarget);
     9         if (window != null)
    10         {
    11             window.LocationChanged -= WindowLocationChanged;
    12         }
    13     }
    14 
    15     //新值添加LocationChanged监听
    16     if (e.NewValue is DependencyObject newPlacementTarget)
    17     {
    18         Window window = Window.GetWindow(newPlacementTarget);
    19         if (window != null)
    20         {
    21             window.LocationChanged -= WindowLocationChanged;
    22             window.LocationChanged += WindowLocationChanged;
    23         }
    24     }
    25     void WindowLocationChanged(object s1, EventArgs e1)
    26     {
    27         if (pop != null && pop.IsOpen)
    28         {
    29             //通知更新相对位置
    30             var mi = typeof(Popup).GetMethod("UpdatePosition", BindingFlags.NonPublic | BindingFlags.Instance);
    31             mi.Invoke(pop, null);
    32         }
    33     }
    34 }

    值得注意的是,原有的绑定目标源要记得取消LocationChanged事件订阅,新的绑定目标源保险起见,也要提前注销再添加事件订阅。

     

    另:通知popup位置更新,也可能通过如下的黑科技:

    1     //通知更新相对位置
    2     var offset = pop.HorizontalOffset;
    3     pop.HorizontalOffset = offset + 1;
    4     pop.HorizontalOffset = offset;

     为何改变一下HorizontalOffset就可行呢?因为上面最终并没有改变HorizontalOffset的值。。。

    原来。。。好吧,先看源码

     1     /// <summary>获取或设置目标原点和弹出项对齐之间的水平距离点。</summary>
     2     /// <returns>
     3     ///   目标原点和 popup 对齐点之间的水平距离。
     4     ///    有关目标原点和 popup 对齐点的信息,请参阅 Popup 放置行为。
     5     ///    默认值为 0。
     6     /// </returns>
     7     [Bindable(true)]
     8     [Category("Layout")]
     9     [TypeConverter(typeof (LengthConverter))]
    10     public double HorizontalOffset
    11     {
    12       get
    13       {
    14         return (double) this.GetValue(Popup.HorizontalOffsetProperty);
    15       }
    16       set
    17       {
    18         this.SetValue(Popup.HorizontalOffsetProperty, (object) value);
    19       }
    20     }
    21 
    22     private static void OnOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    23     {
    24       ((Popup) d).Reposition();
    25     }

    是的,最终调用了Reposition,而Reposition方法中有调用UpdatePosition更新popup位置

     所以以上,更新HorizontalOffset,是更新popup位置的一种捷径。

     3.界面设置绑定目标源

    XXXXX

    posted on 2018-05-25 23:59 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9091131.html

    展开全文
  • 我弄了一个窗口震动的函数,但是不知道一开始窗口的位置,第一次震动的时候窗口会移动很长的距离,这样不是很好看,请问如何获取窗口的初始位置或者设定窗口的初始位置。 还有就是,设置输出的文字颜色是怎么弄的?
  • 向下移动纵滚动条到页面下边某处,点击按钮打开模态窗口会自动显示在整个主画面最顶端中央(纵滚动条自动跳到最开始了)。 但希望能打开的窗口不跳到最上边显示,而是动作在哪个位置的页面,就弹出显示在...
  • VC 拖动窗口某个元素移动位置,在圆形上面按住鼠标左键,圆形可以被拖动哦,练习一下在VC中,如何拖动一个元素变换位置,效果不错哦。
  • Delphi窗口编程实例:如何窗口不可拖动位置,即使鼠标按在标题栏上,也不能拖动窗口窗口变得不可移动,打开时在什么位置 ,就始终保持在某位置,实现此功能关键代码部分:  Msg.WindowPos.x := Left;  //...
  • 今天安装软件时窗口莫名到了屏幕边缘,使用鼠标无法移动其位置,解决方法...3.按键盘上方向键就可以移动窗口啦 哈哈,记录一下,防止自己以后忘记操作,也希望能帮到泥萌(๑╹ヮ╹๑)ノ Studying makes me happy ...

    今天安装软件时窗口莫名到了屏幕边缘,使用鼠标无法移动其位置,解决方法如下:
    1.选择窗口后按下Alt+空格
    2.按M
    3.按键盘上的方向键就可以移动窗口啦

    哈哈,记录一下,防止自己以后忘记操作,也希望能帮到泥萌(๑╹ヮ╹๑)ノ Studying makes me happy

    展开全文
  • 原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位置不会更新。 如何更新位置? 获取当前Popup的...
    原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题

    Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位置不会更新。

    如何更新位置?

    获取当前Popup的Target绑定UserControl所在窗口,位置刷新时,时时更新Popup的位置即可。

    1.添加一个附加属性

    1 /// <summary>
    2 /// Popup位置更新
    3 /// </summary>
    4 public static readonly DependencyProperty PopupPlacementTargetProperty =
    5     DependencyProperty.RegisterAttached("PopupPlacementTarget", typeof(DependencyObject), typeof(PopupHelper), new PropertyMetadata(null, OnPopupPlacementTargetChanged));

     

    2.窗口移动后触发popup更新

    首先,有个疑问,popup首次显示时,为何显示的位置是正确的呢?

    通过查看源码,发现,其实popup也是有内置更新popup位置的!

    而通过查看UpdatePosition代码,其方法确实是更新popup位置的。源码如下:

      1 private void UpdatePosition()
      2 {
      3     if (this._popupRoot.Value == null)
      4         return;
      5     PlacementMode placement = this.Placement;
      6     Point[] targetInterestPoints = this.GetPlacementTargetInterestPoints(placement);
      7     Point[] childInterestPoints = this.GetChildInterestPoints(placement);
      8     Rect bounds = this.GetBounds(targetInterestPoints);
      9     Rect rect1 = this.GetBounds(childInterestPoints);
     10     double num1 = rect1.Width * rect1.Height;
     11     int num2 = -1;
     12     Vector offsetVector1 = new Vector((double)this._positionInfo.X, (double)this._positionInfo.Y);
     13     double num3 = -1.0;
     14     PopupPrimaryAxis popupPrimaryAxis = PopupPrimaryAxis.None;
     15     CustomPopupPlacement[] customPopupPlacementArray = (CustomPopupPlacement[])null;
     16     int num4;
     17     if (placement == PlacementMode.Custom)
     18     {
     19         CustomPopupPlacementCallback placementCallback = this.CustomPopupPlacementCallback;
     20         if (placementCallback != null)
     21             customPopupPlacementArray = placementCallback(rect1.Size, bounds.Size, new Point(this.HorizontalOffset, this.VerticalOffset));
     22         num4 = customPopupPlacementArray == null ? 0 : customPopupPlacementArray.Length;
     23         if (!this.IsOpen)
     24             return;
     25     }
     26     else
     27         num4 = Popup.GetNumberOfCombinations(placement);
     28     for (int i = 0; i < num4; ++i)
     29     {
     30         bool flag1 = false;
     31         bool flag2 = false;
     32         Vector offsetVector2;
     33         PopupPrimaryAxis axis;
     34         if (placement == PlacementMode.Custom)
     35         {
     36             offsetVector2 = (Vector)targetInterestPoints[0] + (Vector)customPopupPlacementArray[i].Point;
     37             axis = customPopupPlacementArray[i].PrimaryAxis;
     38         }
     39         else
     40         {
     41             Popup.PointCombination pointCombination = this.GetPointCombination(placement, i, out axis);
     42             Popup.InterestPoint targetInterestPoint = pointCombination.TargetInterestPoint;
     43             Popup.InterestPoint childInterestPoint = pointCombination.ChildInterestPoint;
     44             offsetVector2 = targetInterestPoints[(int)targetInterestPoint] - childInterestPoints[(int)childInterestPoint];
     45             flag1 = childInterestPoint == Popup.InterestPoint.TopRight || childInterestPoint == Popup.InterestPoint.BottomRight;
     46             flag2 = childInterestPoint == Popup.InterestPoint.BottomLeft || childInterestPoint == Popup.InterestPoint.BottomRight;
     47         }
     48         Rect rect2 = Rect.Offset(rect1, offsetVector2);
     49         Rect rect3 = Rect.Intersect(this.GetScreenBounds(bounds, targetInterestPoints[0]), rect2);
     50         double num5 = rect3 != Rect.Empty ? rect3.Width * rect3.Height : 0.0;
     51         if (num5 - num3 > 0.01)
     52         {
     53             num2 = i;
     54             offsetVector1 = offsetVector2;
     55             num3 = num5;
     56             popupPrimaryAxis = axis;
     57             this.AnimateFromRight = flag1;
     58             this.AnimateFromBottom = flag2;
     59             if (Math.Abs(num5 - num1) < 0.01)
     60                 break;
     61         }
     62     }
     63     if (num2 >= 2 && (placement == PlacementMode.Right || placement == PlacementMode.Left))
     64         this.DropOpposite = !this.DropOpposite;
     65     rect1 = new Rect((Size)this._secHelper.GetTransformToDevice().Transform((Point)this._popupRoot.Value.RenderSize));
     66     rect1.Offset(offsetVector1);
     67     Rect screenBounds = this.GetScreenBounds(bounds, targetInterestPoints[0]);
     68     Rect rect4 = Rect.Intersect(screenBounds, rect1);
     69     if (Math.Abs(rect4.Width - rect1.Width) > 0.01 || Math.Abs(rect4.Height - rect1.Height) > 0.01)
     70     {
     71         Point point1 = targetInterestPoints[0];
     72         Vector vector1 = targetInterestPoints[1] - point1;
     73         vector1.Normalize();
     74         if (!this.IsTransparent || double.IsNaN(vector1.Y) || Math.Abs(vector1.Y) < 0.01)
     75         {
     76             if (rect1.Right > screenBounds.Right)
     77                 offsetVector1.X = screenBounds.Right - rect1.Width;
     78             else if (rect1.Left < screenBounds.Left)
     79                 offsetVector1.X = screenBounds.Left;
     80         }
     81         else if (this.IsTransparent && Math.Abs(vector1.X) < 0.01)
     82         {
     83             if (rect1.Bottom > screenBounds.Bottom)
     84                 offsetVector1.Y = screenBounds.Bottom - rect1.Height;
     85             else if (rect1.Top < screenBounds.Top)
     86                 offsetVector1.Y = screenBounds.Top;
     87         }
     88         Point point2 = targetInterestPoints[2];
     89         Vector vector2 = point1 - point2;
     90         vector2.Normalize();
     91         if (!this.IsTransparent || double.IsNaN(vector2.X) || Math.Abs(vector2.X) < 0.01)
     92         {
     93             if (rect1.Bottom > screenBounds.Bottom)
     94                 offsetVector1.Y = screenBounds.Bottom - rect1.Height;
     95             else if (rect1.Top < screenBounds.Top)
     96                 offsetVector1.Y = screenBounds.Top;
     97         }
     98         else if (this.IsTransparent && Math.Abs(vector2.Y) < 0.01)
     99         {
    100             if (rect1.Right > screenBounds.Right)
    101                 offsetVector1.X = screenBounds.Right - rect1.Width;
    102             else if (rect1.Left < screenBounds.Left)
    103                 offsetVector1.X = screenBounds.Left;
    104         }
    105     }
    106     int x = DoubleUtil.DoubleToInt(offsetVector1.X);
    107     int y = DoubleUtil.DoubleToInt(offsetVector1.Y);
    108     if (x == this._positionInfo.X && y == this._positionInfo.Y)
    109         return;
    110     this._positionInfo.X = x;
    111     this._positionInfo.Y = y;
    112     this._secHelper.SetPopupPos(true, x, y, false, 0, 0);
    113 }
    View Code

     

    那么,我们有什么办法调用这个私有方法呢?我相信大家都想,找到popup源码开发者,爆了他Y的!

    有一种方法,叫反射,反射可以获取类的任一个字段或者属性。

    反射,可以参考:https://www.cnblogs.com/vaevvaev/p/6995639.html

    通过反射,我们获取到UpdatePosition方法,并调用执行。

    1 var mi = typeof(Popup).GetMethod("UpdatePosition", BindingFlags.NonPublic | BindingFlags.Instance);
    2 mi.Invoke(pop, null);

     

    下面是详细的属性更改事件实现:

     1 private static void OnPopupPlacementTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     2 {
     3     Popup pop = d as Popup;
     4 
     5     //旧值取消LocationChanged监听
     6     if (e.OldValue is DependencyObject previousPlacementTarget)
     7     {
     8         Window window = Window.GetWindow(previousPlacementTarget);
     9         if (window != null)
    10         {
    11             window.LocationChanged -= WindowLocationChanged;
    12         }
    13     }
    14 
    15     //新值添加LocationChanged监听
    16     if (e.NewValue is DependencyObject newPlacementTarget)
    17     {
    18         Window window = Window.GetWindow(newPlacementTarget);
    19         if (window != null)
    20         {
    21             window.LocationChanged -= WindowLocationChanged;
    22             window.LocationChanged += WindowLocationChanged;
    23         }
    24     }
    25     void WindowLocationChanged(object s1, EventArgs e1)
    26     {
    27         if (pop != null && pop.IsOpen)
    28         {
    29             //通知更新相对位置
    30             var mi = typeof(Popup).GetMethod("UpdatePosition", BindingFlags.NonPublic | BindingFlags.Instance);
    31             mi.Invoke(pop, null);
    32         }
    33     }
    34 }

    值得注意的是,原有的绑定目标源要记得取消LocationChanged事件订阅,新的绑定目标源保险起见,也要提前注销再添加事件订阅。

     

    另:通知popup位置更新,也可能通过如下的黑科技:

    1     //通知更新相对位置
    2     var offset = pop.HorizontalOffset;
    3     pop.HorizontalOffset = offset + 1;
    4     pop.HorizontalOffset = offset;

     为何改变一下HorizontalOffset就可行呢?因为上面最终并没有改变HorizontalOffset的值。。。

    原来。。。好吧,先看源码

     1     /// <summary>获取或设置目标原点和弹出项对齐之间的水平距离点。</summary>
     2     /// <returns>
     3     ///   目标原点和 popup 对齐点之间的水平距离。
     4     ///    有关目标原点和 popup 对齐点的信息,请参阅 Popup 放置行为。
     5     ///    默认值为 0。
     6     /// </returns>
     7     [Bindable(true)]
     8     [Category("Layout")]
     9     [TypeConverter(typeof (LengthConverter))]
    10     public double HorizontalOffset
    11     {
    12       get
    13       {
    14         return (double) this.GetValue(Popup.HorizontalOffsetProperty);
    15       }
    16       set
    17       {
    18         this.SetValue(Popup.HorizontalOffsetProperty, (object) value);
    19       }
    20     }
    21 
    22     private static void OnOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    23     {
    24       ((Popup) d).Reposition();
    25     }

    是的,最终调用了Reposition,而Reposition方法中有调用UpdatePosition更新popup位置

     所以以上,更新HorizontalOffset,是更新popup位置的一种捷径。

     3. 元素移动/大小变化后,触发更新

    当popup的PlaceTarget绑定一个控件或者一个Grid后,FrameworkElement大小变化/位置变化时,popup位置更新(同上)

    元素大小变化时:

    1     else if (newPlacementTarget is FrameworkElement frameworkElement)
    2     {
    3         frameworkElement.SizeChanged -= ElementOnSizeChanged;
    4         frameworkElement.SizeChanged += ElementOnSizeChanged;
    5     }

    也可以直接监听LayoutUpdated事件,元素大小/位置变化时,LayoutUpdated都会触发。注意:LayoutUpdated触发有点频繁。

    1     else if (newPlacementTarget is FrameworkElement frameworkElement)
    2     {
    3         frameworkElement.LayoutUpdated -= ElementOnLayoutUpdated;
    4         frameworkElement.LayoutUpdated += ElementOnLayoutUpdated;
    5     }

     

    4.界面设置绑定目标源

    1     <Popup x:Name="FirstShowPopup" PlacementTarget="{Binding ElementName=TestButton}" Placement="Custom"
    2         CustomPopupPlacementCallback="{easiUi:Placement Align=RightCenter,OutOfScreenEnabled=True}" PopupAnimation="Fade"
    3         AllowsTransparency="True" StaysOpen="True" HorizontalOffset="-16" VerticalOffset="4"
    4         helper:PopupHelper.LocationUpdatedOnTarget="{Binding ElementName=TestButton}"
    5         helper:PopupHelper.TopmostInCurrentWindow="True">
    6     </Popup>

     

    posted on 2019-01-10 13:34 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/10249497.html

    展开全文
  • 在WinForm程序中,要移动没有标题栏的窗口,基本实现思路是监听需要拖动窗口控件鼠标事件,然后将鼠标位置发送给窗口进行相应位移就可以了。通过借用Windows API也可以很容易实现这一点,比如像下面这样。...

    在WinForm程序中,要移动没有标题栏的窗口,基本的实现思路是监听需要拖动窗口内的控件的鼠标事件,然后将鼠标位置发送给窗口进行相应的位移就可以了。通过借用Windows API也可以很容易实现这一点,比如像下面这样。

    public class Win32Api
    {
        public const int WM_SYSCOMMAND = 0x112;
        public const int SC_DRAGMOVE = 0xF012;
    
        [DllImport("user32.Dll", EntryPoint = "ReleaseCapture")]
        public extern static void ReleaseCapture(); // 鼠标捕获
        [DllImport("user32.Dll", EntryPoint = "SendMessage")]
        public extern static void SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); // 将消息发送给指定的窗口
    }
    
    private void pnlHeader_MouseDown(object sender, MouseEventArgs e)
    {
        Win32Api.ReleaseCapture();
        Win32Api.SendMessage(this.Handle, Win32Api.WM_SYSCOMMAND, Win32Api.SC_DRAGMOVE, 0);
    }
    

    在这里插入图片描述

    当然,你还可以向这样向vb.net教程窗口发送消息,来实现c#教程拖动自定义标题栏移动窗口

    public const int WM_NCLBUTTONDOWN = 0x00A1;
    public const int HTCAPTION = 2;
    
    private void pnlHeader_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            // 释放控件已捕获的鼠标
            pnlHeader.Capture = false;
    
            // 创建并发送WM_NCLBUTTONDOWN消息
            Message msg =
                Message.Create(this.Handle, Win32Api.WM_NCLBUTTONDOWN,
                    new IntPtr(Win32Api.HTCAPTION), IntPtr.Zero);
            this.DefWndProc(ref msg);
        }
    }
    
    展开全文
  • 我现在想获取一个SKYPE的聊天窗口位置并可以移动它,看坛子里有人说用FindWindowEx()之类,但是我并不知道具体聊天窗口的名称什么的不知道怎么做。谢谢指点。
  • 绑定完窗口,然后设置鼠标移动位置之后就移到窗口外面了,如何让鼠标只在窗口移动,对应的移动位置也是</p>
  • 工具是控制台程序,每次窗口出现位置都是逐次向右下角移动的 大家用过应该能理解怎么回事 我现在想写代码控制它,让它每次都固定在左上角(0,0)位置 现在已知方法是MoveWindow,但这样体验不好,...
  • m_TZGridCtrl.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), NULL);
  • 将原来.vdi文件移动到自己要更改位置。3.选定虚拟机,设置,存储中删除原来虚拟机。4.在黑窗口中切换到virtualbox安装路径,输入vboxmanage internalcommands sethduuid "F:\VisualBox-vms\test\...
  • 窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话应用程序,可以使用ClassWizard处理该信息并调用基类函数, 如果函数返回...
  • 如题,工具栏已经添加到上面了,可是不能停靠,只能用Onsize移动到指定位置。 我是在切分窗口绑定视图中添加工具栏, m_wndToolBar.EnableDocking()就报错误,
  • C语言如何在控制台窗口设置光标到指定位置

    万次阅读 多人点赞 2018-04-14 21:09:08
    在用C语言写控制台的程序时,说到控制光标,我们通常就是回车换行或者空格之类的进行移动光标控制,但是这类操作只能是将光标移动到当前光标后面的位置,而且效率极低假设我们想要把光标移动到当前光标以前某个位置...
  • 拖拽移动需要注意是:拖拽移动的窗口如何定位,如果"left"属性为"%" ,以"margin-left"来计算定位,如下实例,如果"left"属性为数字,直接使用"left"即可。 // 弹窗模块拖拽拖动$(function(){ var _move=...
  • 如何让一个窗口,在桌面上自己移动,并且遇到边缘时随机反弹? 我认为这终究还是一个物理问题,下面是我第一次涉及这个问题时使用方式。 我相信一定会有更好方式,欢迎讨论。 我思路: ①首先应该创建一个...
  • 或者求教如何让下拉列表根据或者跟随textarea中光标的位置出现或者移动 不要textarea光标在textarea第几行 第几个字符 要光标在距离左边111,距离上边122这样子.... 还请不吝赐教 谢谢
  • ![图片说明]... 这是我想要的效果 ... ...试过了Qt::FramelessWindowHint 这样就在电脑的所有窗口的前面了.... 怎么才可以只在主窗口前面且固定不移动呢?求大佬解答
  • FlexMDI多窗口组件库,如何使弹出多个窗口不重叠?可以话,能实现多个窗口之间挤压效果吗?就是拖动一个窗口到指定位置,如果指定位置存在另外一个窗口,则拖动窗口移动到此位置后,此位置窗口被挤压走。
  • 然后我希望在主窗口上画各种图形(直线,圆等),检测鼠标左键按下,记录第一个点位置,然后鼠标移动时可以从第一个点的位置画一条到当前位置的直线,大致代码如下: ``` void MainWindow::mousePressEvent...
  • 方法一没有效果,窗口确实移动到了指定位置,然后我希望只显示控件部分大小,但是多余部分不会隐藏起来,没有任何效果。 方法二: ``` void Show(CRect _rect, bool Mode) { MoveWindow(_rect, 1); if(!...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 423
精华内容 169
关键字:

如何移动窗口的位置