xamarin.forms - ¿Cómo cambiar el estado visual de un control en Xamarin Forms?

CorePress2023-11-30  1

Estoy intentando crear una vista tipo pestañas con formularios xamarin simples porque no quiero utilizar ningún complemento de terceros. Para eso utilicé dos cuadros como los que se muestran a continuación y cambié su estado como "Seleccionado" y "Seleccionado". "No seleccionado" cuando se toca ese marco para que se vea así.

Estilo del marco:

<Style TargetType="Frame">
                <Setter Property="VisualStateManager.VisualStateGroups">
                    <VisualStateGroupList>
                        <VisualStateGroup>
                            <VisualState x:Name="Selected">
                                <VisualState.Setters>
                                    <Setter Property="BackgroundColor" Value="Orange" />
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="UnSelected">
                                <VisualState.Setters>
                                    <Setter Property="BackgroundColor" Value="White" />
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateGroupList>
                </Setter>
            </Style>

Mi marco:

<Frame x:Name="AllNewsTab" Padding="10,5,10,5" CornerRadius="3" HasShadow="False" VerticalOptions="FillAndExpand">
                    <Label Text="All" FontFamily="{StaticResource BoldFont}" TextColor="{StaticResource BodyTextColor}" FontSize="Medium" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="Center"/>
                    <Frame.GestureRecognizers>
                        <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="Tab_Tapped"/>
                    </Frame.GestureRecognizers>
                </Frame>

Evento aprovechado:

private void Tab_Tapped(object sender, EventArgs e)
        {
            if (frameSelected != null)
                VisualStateManager.GoToState(frameSelected, "UnSelected");

            VisualStateManager.GoToState((Frame)sender, "Selected");

            frameSelected = (Frame)sender;
}

Pero quiero que un cuadro parezca seleccionado cuando la página aparezca por primera vez. Así que intenté hacer esto en las páginas Método OnAppearing. Pero no funciona. ¿Cuál es el problema aquí?

protected override void OnAppearing()
        {
            VisualStateManager.GoToState(AllNewsTab, "Selected");

            base.OnAppearing();
        }
  • Los comentarios no son para una discusión extensa; esta conversación se ha movido al chat. - Samuel Liew 8 de junio de 2020 a las 5:08


------------------------

Prueba esto, En xamarin, VisualElement tiene 4 estados, como Normal, Deshabilitado, Enfocado y Seleccionado. Y podemos definir nuestros propios VisualElements.

Página principal.Xml

<?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"
             mc:Ignorable="d"
             x:Class="Xam_VS_Test.Views.MainPage">
    <ContentPage.Resources>
        <Style TargetType="Frame">
            <Setter Property="VisualStateManager.VisualStateGroups">
                <VisualStateGroupList>
                    <VisualStateGroup Name="SelectionStates">
                        <VisualState x:Name="Selected">
                            <VisualState.Setters>
                                <Setter Property="BackgroundColor" Value="Orange" />
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState x:Name="UnSelected">
                            <VisualState.Setters>
                                <Setter Property="BackgroundColor" Value="White" />
                            </VisualState.Setters>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateGroupList>
            </Setter>
        </Style>
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout Orientation="Vertical" >
            <Frame x:Name="AllNewsTab" Padding="10,5,10,5" HeightRequest="20" WidthRequest="50" HorizontalOptions="FillAndExpand" CornerRadius="3" HasShadow="False" VerticalOptions="FillAndExpand">
                <Label Text="All" FontSize="Large" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="Center"/>
                <Frame.GestureRecognizers>
                    <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="Tab_Tapped"/>
                </Frame.GestureRecognizers>
            </Frame>
            <Frame x:Name="AllNewsTab2" Padding="10,5,10,5" HeightRequest="20" WidthRequest="50" HorizontalOptions="FillAndExpand" CornerRadius="3" HasShadow="False" VerticalOptions="FillAndExpand">
                <Label Text="1" FontSize="Large" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="Center"/>
                <Frame.GestureRecognizers>
                    <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="Tab_Tapped"/>
                </Frame.GestureRecognizers>
            </Frame>
            <Frame x:Name="AllNewsTab3" Padding="10,5,10,5" HeightRequest="20" WidthRequest="50" HorizontalOptions="FillAndExpand" CornerRadius="3" HasShadow="False" VerticalOptions="FillAndExpand">
                <Label Text="2" FontSize="Large" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="Center"/>
                <Frame.GestureRecognizers>
                    <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="Tab_Tapped"/>
                </Frame.GestureRecognizers>
            </Frame>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Página principal.cs

    public partial class MainPage : ContentPage
    {
        Frame frameSelected;
       public MainPage()
       {
           InitializeComponent();
       }
       protected override void OnAppearing()
       {
         if (frameSelected == null)
         {
            VisualStateManager.GoToState(AllNewsTab, "Selected");
            frameSelected = AllNewsTab;
         }
          base.OnAppearing();
        }
        private void Tab_Tapped(object sender, EventArgs e)
        {
            if (frameSelected != null)
                VisualStateManager.GoToState(frameSelected, "UnSelected");

            VisualStateManager.GoToState((Frame)sender, "Selected");

            frameSelected = (Frame)sender;
        }
    }
    Su guía para un futuro mejor - libreflare
    Su guía para un futuro mejor - libreflare