Xamarin Community Toolkit TabView переключает вкладки при нажатии на запись

У меня странное поведение с TabView. Вид:

      <?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PLUTester.Test.View.Home"
             xmlns:view="clr-namespace:PLUTester.Test.View"
             xmlns:controls2="clr-namespace:MarcTron.Plugin.Controls;assembly=Plugin.MtAdmob"
             xmlns:local="clr-namespace:PLUTester;assembly=PLUTester"
             xmlns:xtc="http://xamarin.com/schemas/2020/toolkit"
             xmlns:localfonts="clr-namespace:PLUTester.AppFonts"
             BackgroundColor="White">
    <ContentPage.Resources>
        <Style TargetType="xtc:TabViewItem">
            <Setter Property="VerticalOptions" Value="Center"/>
            <Setter Property="FontSize" Value="30" />
            <Setter Property="FontSizeSelected" Value="35"/>
            <Setter Property="FontFamily" Value="MyIcon"/>
            <Setter Property="VerticalOptions" Value="FillAndExpand" />
            <Setter Property="TextColor" Value="Gray" />
            <Setter Property="TextColorSelected" Value="Black" />
            <Setter Property="FontAttributesSelected" Value="Bold" />
            <Setter Property="BadgeTextColor" Value="Black"/>
        </Style>

        <Style x:Key="CustomTabStyle" TargetType="xtc:TabView">
            <!--<Setter Property="IsTabTransitionEnabled" Value="True" />-->
            <Setter Property="TabStripHeight" Value="50" />
            <Setter Property="TabContentBackgroundColor" Value="White" />
            <Setter Property="TabIndicatorPlacement" Value="Bottom"/>
            <Setter Property="TabIndicatorColor" Value="Black"/>
            <Setter Property="TabStripPlacement" Value="Bottom" />
        </Style>
    </ContentPage.Resources>
    <ContentPage.Content>
        <Grid>
            <xtc:TabView Style="{StaticResource CustomTabStyle}" IsSwipeEnabled="False">
                <xtc:TabView.TabStripBackgroundView>
                    <Frame BackgroundColor="White" BorderColor="Gray" CornerRadius="0" Margin="-1,0,-1,0"/>
                </xtc:TabView.TabStripBackgroundView>
                <xtc:TabViewItem Text="{x:Static localfonts:FontIcon.SchoolOutline}">
                    <Grid>
                        <ContentView Content="{Binding TestView}"/>
                    </Grid>
                </xtc:TabViewItem>
                <xtc:TabViewItem Text="{x:Static localfonts:FontIcon.CardsOutline}">
                    <Grid>
                        <ContentView Content="{Binding LernView}"/>
                    </Grid>
                </xtc:TabViewItem>
                <xtc:TabViewItem Text="{x:Static localfonts:FontIcon.ChartLine}">
                    <Grid>
                        <ContentView Content="{Binding StatisticsView}"/>
                    </Grid>
                </xtc:TabViewItem>

                <xtc:TabViewItem Text="{x:Static localfonts:FontIcon.Podium}">
                    <Grid>
                        <ContentView Content="{Binding HighscoreView}"/>
                    </Grid>
                </xtc:TabViewItem>

                <xtc:TabViewItem Text="{x:Static localfonts:FontIcon.Tune}">
                    <Grid>
                        <ContentView>
                            <view:Settings/>
                        </ContentView>
                    </Grid>
                </xtc:TabViewItem>
            </xtc:TabView>           
        </Grid>        
  </ContentPage.Content>
</ContentPage>

Viewmodel:

              private ContentView _TestView;

        public ContentView TestView
        {
            get { return _TestView; }
            set { _TestView = value;
                OnPropertyChanged(nameof(TestView));
            }
        }

        private ContentView _LernView;

        public ContentView LernView
        {
            get { return _LernView; }
            set { _LernView = value;
                OnPropertyChanged(nameof(LernView));
            }
        }

        private ContentView _StatisticsView;

        public ContentView StatisticsView
        {
            get { return _StatisticsView; }
            set { _StatisticsView = value;
                OnPropertyChanged(nameof(StatisticsView));
            }
        }

        private ContentView _HighscoreView;

        public ContentView HighscoreView
        {
            get { return _HighscoreView; }
            set { _HighscoreView = value;
                OnPropertyChanged(nameof(HighscoreView));
            }
        }

Вторая страница (LernView) содержит некоторые записи, когда я нажимаю на запись, вкладка переключается обратно на первую страницу, и поэтому невозможно ввести некоторые данные. Странно то, что когда я меняю положение страниц, так что «LernView» находится перед «TestView» в TabView, тогда записи в «LernView» работают так, как ожидалось, но записи в «TestView» отбрасывают меня обратно на первый сайт. Такое же поведение с сборщиком.

Вот вывод из окна отладки при нажатии на запись:

      [ViewRootImpl@b8ac428[MainActivity]] ViewPostIme pointer 0
[ViewRootImpl@b8ac428[MainActivity]] ViewPostIme pointer 1
[InputMethodManager] prepareNavigationBarInfo() DecorView@add6a19[MainActivity]
[InputMethodManager] getNavigationBarColor() -16711423
[InputMethodManager] Starting input: tba=com.modev.plutester ic=com.android.internal.widget.EditableInputConnection@4a24c5d mNaviBarColor -16711423 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
[InputMethodManager] startInputInner - Id : 0
[InputMethodManager] startInputInner - mService.startInputOrWindowGainedFocus
[InputTransport] Input channel constructed: 'ClientS', fd=231
[InputTransport] Input channel destroyed: 'ClientS', fd=226
[InputMethodManager] SSI - flag : 0 Pid : 28689 view : com.modev.plutester
[InputMethodManager] prepareNavigationBarInfo() DecorView@add6a19[MainActivity]
[InputMethodManager] getNavigationBarColor() -16711423
[InputMethodManager] prepareNavigationBarInfo() DecorView@add6a19[MainActivity]
[InputMethodManager] getNavigationBarColor() -16711423
[InputMethodManager] Starting input: tba=com.modev.plutester ic=null mNaviBarColor -16711423 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
[InputMethodManager] startInputInner - Id : 0
[InputMethodManager] startInputInner - mService.startInputOrWindowGainedFocus
[InputTransport] Input channel constructed: 'ClientS', fd=230
[InputTransport] Input channel destroyed: 'ClientS', fd=231
[IInputConnectionWrapper] getExtractedText on inactive InputConnection
[IInputConnectionWrapper] requestCursorAnchorInfo on inactive InputConnection
[InsetsSourceConsumer] setRequestedVisible: visible=true, type=13, host=com.modev.plutester/crc64abfcbdcb04412aea.MainActivity, from=android.view.InsetsSourceConsumer.show:229 android.view.InsetsController.showDirectly:1437 android.view.InsetsController.controlAnimationUnchecked:1110 android.view.InsetsController.applyAnimation:1417 android.view.InsetsController.show:962 android.view.ViewRootImpl$ViewRootHandler.handleMessage:6098 android.os.Handler.dispatchMessage:106 android.os.Looper.loop:246 android.app.ActivityThread.main:8506 java.lang.reflect.Method.invoke:-2 
[SurfaceControl] hide : mNativeObject = 480531777920 - sc.mNativeObject = 480531879648 - Surface(name=Surface(name=5fb0fa1 InputMethod)/@0x49804dd - animation-leash)/@0x1b84285
[SurfaceControl] nativeSetFlags Done : Surface(name=Surface(name=5fb0fa1 InputMethod)/@0x49804dd - animation-leash)/@0x1b84285
[SurfaceControl] hide : mNativeObject = 480531777920 - sc.mNativeObject = 480531879648 - Surface(name=Surface(name=5fb0fa1 InputMethod)/@0x49804dd - animation-leash)/@0x1b84285
[SurfaceControl] nativeSetFlags Done : Surface(name=Surface(name=5fb0fa1 InputMethod)/@0x49804dd - animation-leash)/@0x1b84285
[SurfaceControl] release : mNativeObject = 480531879648 - Surface(name=Surface(name=5fb0fa1 InputMethod)/@0x49804dd - animation-leash)/@0x1b84285 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsAnimationThreadControlRunner.releaseControls:119 android.view.InsetsAnimationThreadControlRunner.access$200:40 
[SurfaceControl] nativeRelease nativeObject s[480531879648]
[SurfaceControl] nativeRelease nativeObject e[480531879648]

Упомянутая запись:

      <Entry Text="{Binding MaxPLU}" Keyboard="Numeric" FontSize="Medium" VerticalOptions="EndAndExpand" WidthRequest="80" HorizontalTextAlignment="Center" HorizontalOptions="Start">
                                            <Entry.Behaviors>
                                                <controls:NumberValidationBehavior/>
                                            </Entry.Behaviors>
                                        </Entry>

Некоторая прояснение:TabView

  1. MyPage1 -> Все работает как положено
  2. MyPage2 -> Нажатие на запись возвращает меня на MyPage1

Теперь переключаю страницы:TabView

  1. MyPage2 -> Все работает как положено
  2. MyPage1 -> Нажатие на запись возвращает меня на MyPage2

Что я делаю неправильно?

1 ответ

Другой обходной путь — отключить все элементы управления (ввод/редактор), которые открывают виртуальную клавиатуру при выходе из вкладки, и включить, когда она находится на активной вкладке.

странно, когда вы сосредоточились на одной записи/редакторе и перемещались по вкладкам, и когда вы перемещаетесь назад на одну страницу после того, как элемент управления сфокусирован, он запускаетFocusedСобытие и вкладка будут настроены, чтобы, по крайней мере, отображать курсор на записи или редакторе.

      private bool _isLernViewActive;

    public bool IsLernViewActive
    {
        get { return _isLernViewActive; }
        set { _isLernViewActive = value;
            OnPropertyChanged(nameof(IsLernViewActive));
        }
    }

Xaml:

      <Entry Text="{Binding MaxPLU}" Keyboard="Numeric" FontSize="Medium" VerticalOptions="EndAndExpand" WidthRequest="80" 
IsEnabled={Binding IsLernViewActive} HorizontalTextAlignment="Center" HorizontalOptions="Start">
      <Entry.Behaviors>
                                            <controls:NumberValidationBehavior/>
                                        </Entry.Behaviors>
                                    </Entry>
Другие вопросы по тегам