我正在编写一个使用Canvas定位元素的地图应用程序.对于每个元素,我必须以编程方式将元素的Lat/Long转换为画布的坐标,然后设置Canvas.Top和Canvas.Left属性.
如果我有一个360x180画布,我可以将画布上的坐标转换为X轴上的-180到180而不是0到360,而Y轴上的90到-90而不是0到180?
扩展要求:
画布可以是任何尺寸,因此如果它是360x180或5000x100仍然可以使用.
Lat/Long区域可能不总是(-90,-180)x(90,180),它可以是任何东西(即(5,-175)x(89,-174)).
像PathGeometry这样的元素是基点,而不是基于Canvas.Top/Left的元素需要工作.
Ryan Lundy.. 6
这是一个全XAML解决方案.好吧,主要是XAML,因为你必须在代码中使用IValueConverter.所以:创建一个新的WPF项目并为其添加一个类.该类是MultiplyConverter:
namespace YourProject { public class MultiplyConverter : System.Windows.Data.IValueConverter { public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return AsDouble(value)* AsDouble(parameter); } double AsDouble(object value) { var valueText = value as string; if (valueText != null) return double.Parse(valueText); else return (double)value; } public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new System.NotSupportedException(); } } }
然后将此XAML用于您的Window.现在,您应该在XAML预览窗口中看到结果.
编辑:您可以通过将您的画布放在另一个画布中来解决背景问题.有点奇怪,但它的确有效.另外,我添加了一个ScaleTransform,它翻转Y轴,使正Y向上,负向向下.请注意哪些名称去哪里:
至于你需要不同范围的新要求,更复杂的ValueConverter可能会有所帮助.
这是一个全XAML解决方案.好吧,主要是XAML,因为你必须在代码中使用IValueConverter.所以:创建一个新的WPF项目并为其添加一个类.该类是MultiplyConverter:
namespace YourProject { public class MultiplyConverter : System.Windows.Data.IValueConverter { public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return AsDouble(value)* AsDouble(parameter); } double AsDouble(object value) { var valueText = value as string; if (valueText != null) return double.Parse(valueText); else return (double)value; } public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new System.NotSupportedException(); } } }
然后将此XAML用于您的Window.现在,您应该在XAML预览窗口中看到结果.
编辑:您可以通过将您的画布放在另一个画布中来解决背景问题.有点奇怪,但它的确有效.另外,我添加了一个ScaleTransform,它翻转Y轴,使正Y向上,负向向下.请注意哪些名称去哪里:
至于你需要不同范围的新要求,更复杂的ValueConverter可能会有所帮助.