【问题标题】:Image moves relative to original location rather than the window图像相对于原始位置而不是窗口移动
【发布时间】:2014-07-20 06:08:48
【问题描述】:

所以我有一个图像,我让它从屏幕中间的特定位置开始。发生了各种各样的事情,我想改变这个图像的位置,但是转换是相对于图像的先前位置而不是相对于窗口发生的。我觉得这不是我的代码有问题,而只是我没有掌握的 WPF 的一些奇怪功能。

那么我应该使用什么方法来相对于窗口移动图像?

目前我正在尝试

        Canvas.SetLeft(this, location.X);
        Canvas.SetTop(this, location.Y);

顺便说一句,这不起作用。它移动图像,但图像是相对于图像先前位置而不是窗口移动的。

这是我要移动的图像的代码。

<UserControl x:Class="UserControls.LetterBlock"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d">
<UserControl.Resources>
    <ResourceDictionary Source="../Dictionaries/LetterBlockTypes.xaml" />
</UserControl.Resources>

<Image Name="LB" HorizontalAlignment="Left" VerticalAlignment="Top" Source="{DynamicResource BLB}" Width="50" Height="50" 
       MouseDown="LetterBlock_MouseDown" MouseMove="LetterBlock_MouseMove" MouseUp="LetterBlock_MouseUp" >
</Image>
</UserControl>

【问题讨论】:

  • 我认为由于您的父画布未声明为占用整个屏幕大小,因此这是可以预料的。我猜画布会自动给定用户控件的尺寸。
  • 您能否发布LetterBlock_MouseMove 或相关事件处理程序的完整事件处理程序?
  • 在 UserControl 本身上调用 Canvas.SetLeftCanvas.SetTop 没有多大意义(除非它真的包含在 Canvas 中,当然你不能依赖它)。您是否打算相对于 UserControl 移动 Image 控件?
  • Weisman,您实际上已经找到了问题的答案。我在画布中有画布,显然这就是问题所在。这个较小的字母块添加了作为孩子的字母,这让一切都搞砸了。对于其他所有人。是的,我将所有图形都放在了画布中。我应该有其他方法吗?

标签: c# wpf


【解决方案1】:

您确定要移动图像吗?试试:

    Canvas.SetLeft(yourImage, location.X);
    Canvas.SetTop(yourImage, location.Y);

考虑到您正在处理 UserControl 中的 Image LetterBlock_MouseDown,我看不出您如何期望图像实例实际上是“this”。

【讨论】:

  • 试过了,它根本不会移动图像。我只让图像随着“this”指示器移动。
  • 你的问题很不清楚。哪一个是帆布? LetterBlock 用户控件是否从画布继承? LetterBlock 用户控件是跨窗口拉伸还是与 Image 具有相同的大小?下载 Snoop,在帖子中添加更多详细信息。
  • 这行不通,因为图像控件不包含在画布中(从问题中可以明显看出)。
【解决方案2】:

如果我让你正确,这将解决你的问题

    Point location = e.GetPosition(Application.Current.MainWindow);
    Canvas.SetLeft(this, location.X);
    Canvas.SetTop(this, location.Y);

在鼠标移动事件中,您可能试图根据用户控件或图像检索鼠标位置。但是您应该检索主窗口,因为您想要相对于窗口的位置。

下面的示例将帮助您检索相对于主窗口的鼠标位置。如果还有其他窗口,您可能需要相应地传递引用。

    e.GetPosition(Application.Current.MainWindow);

【讨论】:

  • 当我拿到我的编程计算机时我会试试看。听起来很有希望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2015-06-18
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多