Как предотвратить перезагрузку карты xamarin при смене шаблона управления? - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Xamarin.Forms.Maps в качестве ContentPresenter для ControlTemplate.

Когда шаблон элемента управления изменяется и перемещает карту в какую-либо область, карта перезагружается с собственной начальной позицией.

Кнопки под моим примером кода могут изменить шаблон элемента управления.

Можно ли его разрешить?

Что мне делать? пожалуйста, разберись.

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        ControlTemplate = (ControlTemplate)Resources["main"];
    }

    void OpenSubTemplate_Clicked(object sender, EventArgs e)
    {
        ControlTemplate = (ControlTemplate)Resources["sub"];
    }

    void OpenMainTemplate_Clicked(object sender, EventArgs e)
    {
        ControlTemplate = (ControlTemplate)Resources["main"];
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
             mc:Ignorable="d"
             x:Class="MapTest.MainPage">

    <ContentPage.Resources>
        <ResourceDictionary>
            <ControlTemplate x:Key="main">
                <Grid>
                    <BoxView HeightRequest="50" Color="Blue" VerticalOptions="Start" />
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
            <ControlTemplate x:Key="sub">
                <Grid>
                    <BoxView HeightRequest="50" Color="Red" VerticalOptions="Start" />
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid>
        <maps:Map x:Name="myMap">
            <x:Arguments>
                <maps:MapSpan>
                    <x:Arguments>
                        <maps:Position>
                            <x:Arguments>
                                <x:Double>36.9628066</x:Double>
                                <x:Double>-122.0194722</x:Double>
                            </x:Arguments>
                        </maps:Position>
                        <x:Double>0.01</x:Double>
                        <x:Double>0.01</x:Double>
                    </x:Arguments>
                </maps:MapSpan>
            </x:Arguments>
        </maps:Map>
        <StackLayout Orientation="Horizontal" VerticalOptions="End">
            <Button Text="Sub" BackgroundColor="Red" Clicked="OpenSubTemplate_Clicked" HorizontalOptions="FillAndExpand" />
            <Button Text="Main" BackgroundColor="Blue" Clicked="OpenMainTemplate_Clicked" HorizontalOptions="FillAndExpand" />
        </StackLayout>
    </Grid>

</ContentPage>

1 Ответ

1 голос
/ 06 февраля 2020

Я проверяю это. Я обнаружил, что эта проблема только что произошла в элементах управления карты. Если мы использовали Button Entry или Image, все они не будут перезагружаться при изменении шаблона управления. Вот два запущенных GIF.

используется Button Entry или Image

enter image description here

использованная карта

enter image description here

Если вы все еще хотите достичь этого результата, мой обходной путь не использовать это ControlTemplate. Просто используйте Gird, чтобы поставить контроль. Обновление местоположения по карте API. Здесь работает GIF. enter image description here

Вот мой макет.

 <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.1*" />
            <RowDefinition Height="0.8*" />
            <RowDefinition Height="0.1*" />
        </Grid.RowDefinitions>
        <BoxView x:Name="MyBoxView" HeightRequest="50" Color="Red" VerticalOptions="Start"  Grid.Row="0"/>
        <!--<ContentPresenter  Grid.Row="1" />-->
        <maps:Map x:Name="myMap" Grid.Row="1"  >
            <x:Arguments>
                <maps:MapSpan>
                    <x:Arguments>
                        <maps:Position>
                            <x:Arguments>
                                <x:Double>36.9628066</x:Double>
                                <x:Double>-122.0194722</x:Double>
                            </x:Arguments>
                        </maps:Position>
                        <x:Double>0.01</x:Double>
                        <x:Double>0.01</x:Double>
                    </x:Arguments>
                </maps:MapSpan>
            </x:Arguments>
        </maps:Map>
        <StackLayout Orientation="Horizontal" VerticalOptions="End" Grid.Row="2">
            <Button Text="Sub" BackgroundColor="Red" Clicked="OpenSubTemplate_Clicked" HorizontalOptions="FillAndExpand" />
            <Button Text="Main" BackgroundColor="Blue" Clicked="OpenMainTemplate_Clicked" HorizontalOptions="FillAndExpand" />
        </StackLayout>
    </Grid>

Вот мой фоновый код.

         void OpenSubTemplate_Clicked(object sender, System.EventArgs e)
    {
        MyBoxView.Color=Color.Red;
        myMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(47.6368678, -122.137305), Distance.FromMiles(1.0)));
    }

    void OpenMainTemplate_Clicked(object sender, System.EventArgs e)
    {
        MyBoxView.Color = Color.Blue;
        myMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(36.9628066, -122.0194722), Distance.FromMiles(1.0)));

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...