gpt4 book ai didi

wpf - 没有在 child 身上调用 ArrangeOverride?

转载 作者:行者123 更新时间:2023-12-03 10:43:47 24 4
gpt4 key购买 nike

我正在使用 GreatMaps.NET 库 (https://greatmaps.codeplex.com/) 的面向 MVVM 的分支,但我的问题归结为使用自定义 Canvas 作为 ItemsControl 的 ItemsPanel 的基本问题。本质上, map 是一个 ItemsControl,其中一个 MapCanvas 将其子项放置如下:

protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in Children)
{
PointLatLng position = new PointLatLng(GetTop(child), GetLeft(child));

GMapControl map = Owner as GMapControl;
if (map != null)
{
GPoint p = map.FromLatLngToLocal(position);
p.Offset(-(long)(map.MapTranslateTransform.X + child.DesiredSize.Width * 0.5), -(long)(map.MapTranslateTransform.Y + child.DesiredSize.Height * 0.5));

Rect rect = new Rect(p.X, p.Y, child.DesiredSize.Width, child.DesiredSize.Height);
child.Arrange(rect);
}
}
return arrangeSize;
}

这是因为我的 ItemContainerStyle 为每个 map 项绑定(bind)到 ViewModel 中的纬度和经度,如下所示(连同 ZIndex,我已将其设置为 99 作为占位符):
<Setter Property="Canvas.Left" Value="{Binding Longitude}" />
<Setter Property="Canvas.Top" Value="{Binding Latitude}" />
<Setter Property="Canvas.ZIndex" Value="{Binding ZIndex}" />

我正在使用带有 DataType 字段的 DataTemplates 来调整每个元素的显示方式,并且该部分工作正常。

有些元素(例如 map 上的路线线)我不需要作为点元素,而是作为子元素的序列。为此,我只是按照模式制作了一个 DataTemplate,在其中我使用另一个 MapCanvas 绑定(bind)到与其所有者相同的 MapControl(这里,MapOverlay 只是 MapCanvas 的副本,它覆盖 OnRender 以在其子项之间绘制线条):
<DataTemplate DataType="{x:Type viewModels:RouteViewModel}">
<ItemsControl ItemsSource="{Binding Locations}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<wpf:MapOverlay Name="MapOverlay" Owner="{Binding Path=., RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type wpf:GMapControl}}}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Longitude}" />
<Setter Property="Canvas.Top" Value="{Binding Latitude}" />
<Setter Property="Canvas.ZIndex" Value="{Binding ZIndex}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Fill="Blue" Stroke="Black" Width="10" Height="10"></Ellipse>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>

为了保持绑定(bind)正常工作,RouteViewModel 仍然有自己的 Lat/Lng,这似乎仅在我将它们定位在沿路线的点列表的初始点时才有效:
public double Latitude => Locations.Select(loc => loc.Latitude).FirstOrDefault();
public double Longitude => Locations.Select(loc => loc.Longitude).FirstOrDefault();

总结:
  • 我有一个使用 MapCanvas 对元素进行地理空间定位的 GMapControl ItemsControl。 DataTypes 用于选择每个元素使用哪个 DataTemplate。这适用于基于点的元素,例如标记。
  • 其中一个 DataTemplates 是 ItemsControl,它使用另一个 MapCanvas 变体 (MapOverlay) 作为其 ItemsPanel,以在子元素之间绘制线条。这在启动时起作用,当它的 ArrangeOverride 执行时。
  • 平移 map 有效,尽管在 MapOverlay 中没有调用 ArrangeOverride。

  • 问题:虽然我的元素最初显示正确定位,但缩放 map (通过 map 控件触发 InvalidateVisual 和 UpdateLayout)不会导致在嵌套的 MapOverlay 上调用 ArrangeOverride。这会导致路线不再正确定位 - 它不会缩放。

    关于为什么排列失效没有渗透到嵌套的 MapOverlay 和/或有关如何修复它的提示的任何建议?

    附录:仅本地图最初位于其第一个元素时,该路线才正确放置 - 整个路线的纬度/经度是一个单独的问题,我欢迎提出想法。

    最佳答案

    实际上不是您问题的答案,但它可能会让您大致了解如何显示路线,即由线条连接的圆圈的集合。

    以下示例使用 XAML MapControl库,但很可能基于任何其他具有某种 MapItemsControl 的 map 库来实现(例如 MS Bing map )。

    我们的想法是收集 Location构成您的路线的实例。你会有一个 MapPolyline并绑定(bind)其Locations属性到路由点集合。然后放一个MapItemsControl在它上面绑定(bind)它的ItemsSource到同一个集合。请注意 ItemTemplate将路径控件与 EllipseGeometries 一起使用而不是 Ellipses,因为它们以点位置为中心,而 Ellipses 顶部/左侧对齐。

    <map:MapPanel>

    <map:MapPolyline Locations="{Binding RouteLocations}"
    Stroke="DarkBlue" StrokeThickness="3"/>

    <map:MapItemsControl ItemsSource="{Binding RouteLocations}">
    <map:MapItemsControl.ItemContainerStyle>
    <Style TargetType="map:MapItem">
    <Setter Property="map:MapPanel.Location" Value="{Binding}"/>
    </Style>
    </map:MapItemsControl.ItemContainerStyle>
    <map:MapItemsControl.ItemTemplate>
    <DataTemplate>
    <Path Fill="Red">
    <Path.Data>
    <EllipseGeometry RadiusX="5" RadiusY="5"/>
    </Path.Data>
    </Path>
    </DataTemplate>
    </map:MapItemsControl.ItemTemplate>
    </map:MapItemsControl>

    </map:MapPanel>

    如果路径点不是 Location s 你可以在两个绑定(bind)中使用绑定(bind)转换器将你的路由点类型转换为 Location .

    关于wpf - 没有在 child 身上调用 ArrangeOverride?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126113/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com