我正在开发一个动态的C# WPF应用程序(在Windows 10上),使用全屏的
是否有一种方法可以防止控件在移动时重叠或“共享空间”在网格上?换句话说,是否可以添加某种冲突检测机制?我是否应该使用
MainWindow.xaml.cs:
Grid
。控件会在运行时动态添加到网格中(由Dictionary<>
管理),我最近添加了代码,使用TranslateTransform
使得这些控件能够随着鼠标在网格上移动(也是在运行时进行)(但现在我开始对其可行性感到怀疑)。是否有一种方法可以防止控件在移动时重叠或“共享空间”在网格上?换句话说,是否可以添加某种冲突检测机制?我是否应该使用
if
语句来检查控件边距范围或其他内容?我的移动事件如下所示:MainWindow.xaml.cs:
public partial class MainWindow : Window
{
// Orientation variables:
public bool _isInDrag = false;
public Dictionary<object, TranslateTransform> PointDict = new Dictionary<object, TranslateTransform();
public Point _anchorPoint;
public Point _currentPoint;
public MainWindow()
{
InitializeComponent();
}
public static void Control_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_isInDrag)
{
var element = sender as FrameworkElement;
element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}
}
public static void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}
public static void Control_MouseMove(object sender, MouseEventArgs e)
{
if (_isInDrag)
{
_currentPoint = e.GetPosition(null);
TranslateTransform tt = new TranslateTransform();
bool isMoved = false;
if (PointDict.ContainsKey(sender))
{
tt = PointDict[sender];
isMoved = true;
}
tt.X += _currentPoint.X - _anchorPoint.X;
tt.Y += (_currentPoint.Y - _anchorPoint.Y);
(sender as UIElement).RenderTransform = tt;
_anchorPoint = _currentPoint;
if (isMoved)
{
PointDict.Remove(sender);
}
PointDict.Add(sender, tt);
}
}
}
MainWindow.xaml (example):
<Window x:Name="MW" x:Class="MyProgram.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyProgram"
mc:Ignorable="d"
Title="MyProgram" d:DesignHeight="1080" d:DesignWidth="1920" ResizeMode="NoResize" WindowState="Maximized" WindowStyle="None">
<Grid x:Name="MyGrid" />
<Image x:Name="Image1" Source="pic.png" Margin="880,862,0,0" Height="164" Width="162" HorizontalAlignment="Left" VerticalAlignment="Top" MouseLeftButtonDown="Control_MouseLeftButtonDown" MouseLeftButtonUp="Control_MouseLeftButtonUp" MouseMove="Control_MouseMove" />
<TextBox x:Name="Textbox1" Margin="440,560,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" MouseLeftButtonDown="Control_MouseLeftButtonDown" MouseLeftButtonUp="Control_MouseLeftButtonUp" MouseMove="Control_MouseMove" />
</Window>
< p > < em > 编辑: < /em > 看起来使用 < code > TranslateTransform < /code > 移动控件不会改变该控件的边距。不确定为什么。< /p >
< p > < em > 编辑2: < /em > 没有得到太多关注。如果有人需要任何澄清,请问。 < /p >
< p > < em > 编辑3: < /em > 很确定我不能使用 < code > TranslateTransform < /code > ,因为它不会改变给定控件的边距。是否有其他替代方法?< /p >
< p > < em > 编辑4: < /em > 为那些想要复制和粘贴的人添加了一些“样板”代码。如果您对此有任何疑问,请告诉我。 < /p >
TransformToAncestor
确定相对于网格的实际位置。一旦您拥有控件占用的完整矩形,就可以使用这些矩形的Intersects
函数检查重叠。顺便说一下:如果您想坚持使用变换,请改用LayoutTransform
而不是RenderTransform
。 - Manfred Radlwimmer