C# 如何制作UIElement';位置变换持久化?
在寻找在WPF中拖动UIElement的方法时,我遇到了一些代码,并一直在尝试它。单击元素时,它会很好地跟随鼠标,但在随后的拖动事件中,元素会将自身重置为其原始位置 xaml设置:非常简单,只是一个有史以来最原始名称的命名画布和元素,在本例中是一个称为Tile1的网格C# 如何制作UIElement';位置变换持久化?,c#,wpf,location,rendertransform,C#,Wpf,Location,Rendertransform,在寻找在WPF中拖动UIElement的方法时,我遇到了一些代码,并一直在尝试它。单击元素时,它会很好地跟随鼠标,但在随后的拖动事件中,元素会将自身重置为其原始位置 xaml设置:非常简单,只是一个有史以来最原始名称的命名画布和元素,在本例中是一个称为Tile1的网格 <Grid> <Canvas x:Name="Canvas" Width="200" Height="300" Background="LightGray"> &l
<Grid>
<Canvas x:Name="Canvas" Width="200" Height="300" Background="LightGray">
<Grid x:Name="Tile1">
<Border BorderBrush="Black" BorderThickness="1" Background="White">
<Control Width="25" Height="25"/>
</Border>
</Grid>
</Canvas>
</Grid>
在原始示例(添加了参考)中,甚至没有使用MouseUpEvent。如果没有它,我的元素只会在每个MouseDragEvent重置为其原始位置0,0。有了它,它会跳得到处都是
我的思路是以某种方式将元素的当前位置设置为MouseUpEvent发生的位置。
我一直在摆弄各种各样的东西,因为这种特殊的东西对我来说是相当新鲜的。例如:Tile1.TransformToAncestor(画布)、Transform(鼠标定位)代码>
我还发现VisualOffset有我需要的信息,所以在重置之前,它已经存储在对象上了,但我还没有找到以任何形式访问它的方法。
Tile1.SetValue(VisualOffset.X=…)代码>或Tile1Grid.GetValue(VisualOffset)代码>
因此,基本上,有没有一种方法可以不让元素在RenderTransform后重置其位置?我没有发现MouseLeftButtonDown
事件有用,所以我删除了它:
我注意到移动鼠标时出现了一些延迟,这可能会让人恼火,可能事件需要异步运行
RenderTransform似乎不稳定,但我使用以下方法移动了UIElement,使其保持不变:
private void MovableTile_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
tile.CaptureMouse();
}
与
然后
private void MovableTile_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
tile.ReleaseMouseCapture();
}
鼠标座是这里的钥匙。:) 我的回答解决了你的问题吗?如果没有,请让我知道,如果我可以帮助改善它。不幸的是,瓷砖仍然保持跳跃。我感到惊讶的是,它没有使用MouseLeftButtonDown就移动了,但根据我的经验,如果省略它,它的响应性就差了。
private void MovableTile_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
tile.CaptureMouse();
}
private void MovableTile_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var tile = sender as UIElement;
var mousePosition = e.GetPosition(canvas);
Canvas.SetLeft(tile, mousePosition.X);
Canvas.SetTop(tile, mousePosition.Y);
}
}
private void MovableTile_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
tile.ReleaseMouseCapture();
}