C# 如何旋转放置在Mapcontrol上的图像 问题

C# 如何旋转放置在Mapcontrol上的图像 问题,c#,uwp,win-universal-app,uwp-xaml,uwp-maps,C#,Uwp,Win Universal App,Uwp Xaml,Uwp Maps,我有一个在地图上跟踪车辆的应用程序。然而,我不能让这些小家伙朝着他们的运动方向旋转。基本上,他们都是横着走!啊 代码 放在地图上的图像似乎完全忽略了我试图应用的任何角度 为了理解为什么旋转没有生效,让我们先看看下面的图片,它取自VisualStudio中的Live Visual树- 我使用一个矩形,但是在你的例子中,你会看到你的图像控件。将其插入MapControl.Children集合时,它将被一个名为MapOverlyPresenter的特殊元素包装,如图所示 这个MapOverlyPres

我有一个在地图上跟踪车辆的应用程序。然而,我不能让这些小家伙朝着他们的运动方向旋转。基本上,他们都是横着走!啊

代码
放在地图上的图像似乎完全忽略了我试图应用的任何角度

为了理解为什么旋转没有生效,让我们先看看下面的图片,它取自VisualStudio中的Live Visual树-

我使用一个矩形,但是在你的例子中,你会看到你的图像控件。将其插入MapControl.Children集合时,它将被一个名为MapOverlyPresenter的特殊元素包装,如图所示

这个MapOverlyPresenter是MapControl中的一个内部元素,令人惊讶的是,互联网上没有关于它具体做什么的官方文档。我的猜测是,当您缩放或旋转贴图时,该覆盖只是通过向相反方向缩放或旋转来响应,以保持子元素的原始大小和旋转,这导致内部图像的旋转变换以某种方式丢失

附言和成分在这里也没有影响

解决方案 解决这一问题的方法很简单——与其直接在图像上公开旋转变换,不如创建一个名为ImageControl的用户控件,该控件封装此图像及其变换,具有UriPath和Angle等依赖属性,这些属性负责将信息向下传递到内部图像及其CompositeTransform属性

imagecontrolxaml

如何使用此ImageControl

结果


希望这有帮助

为了理解为什么旋转没有生效,让我们先看看下面的图片,它取自VisualStudio中的Live Visual树-

我使用一个矩形,但是在你的例子中,你会看到你的图像控件。将其插入MapControl.Children集合时,它将被一个名为MapOverlyPresenter的特殊元素包装,如图所示

这个MapOverlyPresenter是MapControl中的一个内部元素,令人惊讶的是,互联网上没有关于它具体做什么的官方文档。我的猜测是,当您缩放或旋转贴图时,该覆盖只是通过向相反方向缩放或旋转来响应,以保持子元素的原始大小和旋转,这导致内部图像的旋转变换以某种方式丢失

附言和成分在这里也没有影响

解决方案 解决这一问题的方法很简单——与其直接在图像上公开旋转变换,不如创建一个名为ImageControl的用户控件,该控件封装此图像及其变换,具有UriPath和Angle等依赖属性,这些属性负责将信息向下传递到内部图像及其CompositeTransform属性

imagecontrolxaml

如何使用此ImageControl

结果


希望这有帮助

真棒,详细的回答!谢谢你的帮助!为什么显示错误-在类型ImageControl中未找到ConvertToBitmapImage?@user2431727您需要以14393或更高版本为目标才能使用函数x:Bind.my的目标是10240。我可以直接从车辆图像传递位图图像吗?而不是uriPath?@user2431727你只需要写一个普通的值转换器就可以了。太棒了,详细的答案!谢谢你的帮助!为什么显示错误-在类型ImageControl中未找到ConvertToBitmapImage?@user2431727您需要以14393或更高版本为目标才能使用函数x:Bind.my的目标是10240。我可以直接从车辆图像传递位图图像吗?您只需要编写一个普通的值转换器,而不是uriPath?@user2431727。
Image vehicleImage = new Image
{
  //Set image size and source
};
RenderTransform rotation= new RotateTransform{Angle = X};
vehicleImage.RenderTransfrom = rotation; 
_mainMap.Children.Add(vehicleImage);
MapControl.SetLocation(vehicleImage, _position);
<UserControl x:Class="App1.ImageControl" ...>
    <Image RenderTransformOrigin="0.5,0.5"
           Source="{x:Bind ConvertToBitmapImage(UriPath), Mode=OneWay}"
           Stretch="UniformToFill">
        <Image.RenderTransform>
            <CompositeTransform Rotation="{x:Bind Angle, Mode=OneWay}" />
        </Image.RenderTransform>
    </Image>
</UserControl>
public string UriPath
{
    get => (string)GetValue(UriPathProperty);
    set => SetValue(UriPathProperty, value);
}
public static readonly DependencyProperty UriPathProperty = DependencyProperty.Register(
    "UriPath", typeof(string), typeof(ImageControl), new PropertyMetadata(default(string)));     

public double Angle
{
    get => (double)GetValue(AngleProperty);
    set => SetValue(AngleProperty, value);
}
public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
    "Angle", typeof(double), typeof(ImageControl), new PropertyMetadata(default(double)));

public BitmapImage ConvertToBitmapImage(string path) => new BitmapImage(new Uri(BaseUri, path));
var vehicleImage = new ImageControl
{
    Width = 80,
    UriPath = "/Assets/car.png",
    Angle = 45
};

_mainMap.Children.Add(vehicleImage);