Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何制作UIElement';位置变换持久化?_C#_Wpf_Location_Rendertransform - Fatal编程技术网

C# 如何制作UIElement';位置变换持久化?

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

在寻找在WPF中拖动UIElement的方法时,我遇到了一些代码,并一直在尝试它。单击元素时,它会很好地跟随鼠标,但在随后的拖动事件中,元素会将自身重置为其原始位置

xaml设置:非常简单,只是一个有史以来最原始名称的命名画布和元素,在本例中是一个称为Tile1的网格

<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();
    }