HorizontalTextAlignment игнорируется после навигации - PullRequest
0 голосов
/ 09 июня 2018

Я создал простое приложение, в котором пользователи могут видеть больше информации в разделе, если они вкладывают метку, которая видна на рисунках ниже.

The text is hidden

The text is shown

Проблема в том, что после перехода к AnotherPage и обратно текст перемещается влево, хотя я установил HorizontalTextAlignment в End.Это происходит только тогда, когда я показал раздел и снова его скрыл (дважды нажав на ярлык).Проблема проиллюстрирована на рисунке ниже, где y расположен слева.

After navigation

Мой исходный код для отображения простого приложения сэту проблему можно загрузить с этой ссылки Dropbox.

РЕДАКТИРОВАТЬ Добавлен пример кода

ContentPage очень просткак

<StackLayout>
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>
      <Label Text="Test" VerticalOptions="Start" />
      <Label Text="{Binding Text}" HorizontalTextAlignment="End" TextColor="Red" HorizontalOptions="FillAndExpand" BackgroundColor="Yellow">
         <Label.GestureRecognizers>
            <TapGestureRecognizer Command="{Binding ChangeVisibilityCommand}" />
         </Label.GestureRecognizers>
      </Label>
   </Grid>

   <StackLayout IsVisible="{Binding IsVisible}">
      <Label Text="Text 1" />
      <Label Text="Text 2" />
   </StackLayout>

   <Button Command="{Binding OpenAnotherPageCommand}" Text="Open Another Page" />

</StackLayout>

А ViewModel показан ниже

public class MainPageViewModel : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   private ICommand _changeVisibilityCommand;
   public ICommand ChangeVisibilityCommand
   {
      get => _changeVisibilityCommand;
      set
      {
         if (value != _changeVisibilityCommand)
         {
            _changeVisibilityCommand = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ChangeVisibilityCommand)));
         }
      }
   }

   private bool _isVisible;
   public bool IsVisible
   {
      get => _isVisible;
      set
      {
         if (value != _isVisible)
         {
            _isVisible = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsVisible)));
         }
      }
   }

   private ICommand _openAnotherPageCommand;
   public ICommand OpenAnotherPageCommand
   {
      get => _openAnotherPageCommand;
      set
      {
         if (value != _openAnotherPageCommand)
         {
            _openAnotherPageCommand = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OpenAnotherPageCommand)));
         }
      }
   }

   private string _text = "u";
   public string Text
   {
      get => _text;
      set
      {
         if (!string.Equals(_text, value, StringComparison.InvariantCultureIgnoreCase))
         {
            _text = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text)));
         }
      }
   }

   public MainPageViewModel()
   {
      ChangeVisibilityCommand = new Command(() =>
      {
         IsVisible = !IsVisible;
         Text = IsVisible ? "x" : "y";
      });

      OpenAnotherPageCommand = new Command(() =>
      {
         (Application.Current.MainPage as NavigationPage)?.PushAsync(new AnotherPage());
      });
   }
}

А AnotherPage просто показывает текст, например

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Изменить HorizontalOptions="FillAndExpand"

На HorizontalOptions="CenterAndExpand"

Это заставит текст расшириться от центра и будет помещен в конце.

Кпринудительно вставив текст вправо, вы можете добавить еще одно определение столбца к вашей сетке:

<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

Поместите и вставьте объект в первую ячейку, одну слева:

  • число сверху (0)
  • число слева (0)

и ваша метка во второй ячейке, одна справа:

  • число сверху (0)
  • число слева (1)

Область текста будет соответствовать длине текста и всегда будет соответствовать

Надеюсь, эта информация поможет!

Подробнее о сетке вы можете прочитать в документации: https://docs.microsoft.com/en-us/xamarin/android/user-interface/layouts/grid-layout

0 голосов
/ 12 июня 2018

Прежде всего, я не смог воспроизвести вашу проблему, используя последнюю версию Xamarin.Может быть, простое обновление Xamarin (Forms) также удалит нежелательное поведение в вашем случае.

Если нет, у вас есть два варианта:

1 - использовать HorizontalOptions вместо

HorizontalOptions = "EndAndExpand"

, поскольку HorizontalOptions имеет более высокий приоритет в механизме макета.Не самый элегантный способ, но, безусловно, самый надежный.

2 - Использовать привязку данных

В вашей модели просто добавьте следующее свойство:

    public TextAlignment LabelAlignment
    {
        get => labelAlignment;
        set
        {
            labelAlignment = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LabelAlignment)));
        }
    }
    private TextAlignment labelAlignment = TextAlignment.End;

И в вашем Xaml вы меняете HorizontalAlignment на

HorizontalTextAlignment = "{Binding LabelAlignment}"

Это будет работать, потому что после того, как ваш экран создан, значения вмодель будет загружена и обновлена ​​позже.

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