如何用单独的 Pin 替换 MapView?
How to replace MapView with separate Pins?
我正在尝试更改我的 Xamarin Forms 应用程序(使用 Mapsui 和 Prism)中的 MapView,因为我需要单独的视图来存储 Pin 图。第一个 MapView(我们称之为 default
)用于显示列表中的所有引脚。第二个 MapView (history
) 用于显示新的图钉,这些图钉在离开页面时被移除。
我有 Dictionary
用于存储我的 MapView,以便轻松访问我想要的任何视图。每个创建的 MapView 都有 Map 的相同实例。我想从 default
更改为 history
,这应该隐藏添加到 default
视图中的图钉。
我用这个改变观点:
public void ChangeView(string name)
{
var prev = MapView;
loggerService.Info($"Pins: {prev.Pins.Count}");
MapView = GetView(name); // Current MapView in XAML, returns instance of MapView
loggerService.Info($"New view pins: {MapView.Pins.Count}");
Task.Factory.StartNew(() =>
{
Task.Delay(2000).Wait();
loggerService.Info($"View pins: {MapView.Pins.Count}");
});
MapView.Refresh();
}
带日志的额外代码用于调试目的 - 它显示正确的值(前一个引脚 = 7,新引脚 = 0,查看引脚 = 0)。
我添加了 history
不带缩放按钮的视图,以确保它正在发生变化 - 而且确实发生了变化(所以我认为不需要 post XAML)。
我应该如何更改 MapView 以在导航到历史记录时隐藏图钉并在切换回默认视图时显示它们?
还是有更好的方法 'group' Pin 图并 hide/show 它们基于名称?
更新
我认为这可能很重要:
public Pin AddMarker(Position point)
{
var pin = new Pin(MapView)
{
Label = "PinType.Pin",
Position = point,
Type = PinType.Pin,
Transparency = 0.5f,
Color = Xamarin.Forms.Color.FromRgb(2, 144, 210),
Scale = 0.5f,
};
MapView.Pins.Add(pin);
return pin;
}
这是我添加 Pin 图以查看的方式。这是和上面一样的MapView(所有代码都来自MapService
)。
部分选项
- 或许您可以将 Pin 图的 IsVisible 属性 绑定到视图中的 HistoryMode 字段。我自己从来没用过这个。
- 使用一些较低级别的功能。像
- 为默认层和历史记录使用单独的层,并在需要时 enable/disable 使用它们。您可能需要将 WGS84(gps 坐标)转换为 SphericalMercator。 https://mapsui.com/api/Mapsui.Projection.SphericalMercator.html?q=sphericalmercator
- 使用主题样式。它有一个方法可用于指定您需要的任何样式 (visible/color/symbol) 和特征属性。 https://mapsui.com/api/Mapsui.Styles.Thematics.ThemeStyle.html?q=themestyle
对于较低级别的功能,您可能需要示例才能开始使用:https://mapsui.com/documentation/samples.html
我正在尝试更改我的 Xamarin Forms 应用程序(使用 Mapsui 和 Prism)中的 MapView,因为我需要单独的视图来存储 Pin 图。第一个 MapView(我们称之为 default
)用于显示列表中的所有引脚。第二个 MapView (history
) 用于显示新的图钉,这些图钉在离开页面时被移除。
我有 Dictionary
用于存储我的 MapView,以便轻松访问我想要的任何视图。每个创建的 MapView 都有 Map 的相同实例。我想从 default
更改为 history
,这应该隐藏添加到 default
视图中的图钉。
我用这个改变观点:
public void ChangeView(string name)
{
var prev = MapView;
loggerService.Info($"Pins: {prev.Pins.Count}");
MapView = GetView(name); // Current MapView in XAML, returns instance of MapView
loggerService.Info($"New view pins: {MapView.Pins.Count}");
Task.Factory.StartNew(() =>
{
Task.Delay(2000).Wait();
loggerService.Info($"View pins: {MapView.Pins.Count}");
});
MapView.Refresh();
}
带日志的额外代码用于调试目的 - 它显示正确的值(前一个引脚 = 7,新引脚 = 0,查看引脚 = 0)。
我添加了 history
不带缩放按钮的视图,以确保它正在发生变化 - 而且确实发生了变化(所以我认为不需要 post XAML)。
我应该如何更改 MapView 以在导航到历史记录时隐藏图钉并在切换回默认视图时显示它们? 还是有更好的方法 'group' Pin 图并 hide/show 它们基于名称?
更新 我认为这可能很重要:
public Pin AddMarker(Position point)
{
var pin = new Pin(MapView)
{
Label = "PinType.Pin",
Position = point,
Type = PinType.Pin,
Transparency = 0.5f,
Color = Xamarin.Forms.Color.FromRgb(2, 144, 210),
Scale = 0.5f,
};
MapView.Pins.Add(pin);
return pin;
}
这是我添加 Pin 图以查看的方式。这是和上面一样的MapView(所有代码都来自MapService
)。
部分选项
- 或许您可以将 Pin 图的 IsVisible 属性 绑定到视图中的 HistoryMode 字段。我自己从来没用过这个。
- 使用一些较低级别的功能。像
- 为默认层和历史记录使用单独的层,并在需要时 enable/disable 使用它们。您可能需要将 WGS84(gps 坐标)转换为 SphericalMercator。 https://mapsui.com/api/Mapsui.Projection.SphericalMercator.html?q=sphericalmercator
- 使用主题样式。它有一个方法可用于指定您需要的任何样式 (visible/color/symbol) 和特征属性。 https://mapsui.com/api/Mapsui.Styles.Thematics.ThemeStyle.html?q=themestyle
对于较低级别的功能,您可能需要示例才能开始使用:https://mapsui.com/documentation/samples.html