导航后忽略Horizo​​ntalTextAlignment

时间:2018-06-09 09:50:02

标签: xamarin xamarin.forms xamarin.android

我创建了一个简单的应用程序,用户可以在部分中看到更多信息,如果他们选中了标签,可以在下面的图片中看到。

The text is hidden

The text is shown

问题是,导航到AnotherPage并返回后,文本会向左移动,即使我已将HorizontalTextAlignment设置为End。 这只会发生,当我显示该部分并再次隐藏它(通过点击标签两次)。 问题如下图所示,其中y位于左侧。

After navigation

我可以从this Dropbox link.

下载用于显示有此问题的简单应用的源代码

修改 的 添加了代码示例

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 :(得分:0)

首先,我无法使用最新版本的Xamarin重现您的问题。也许只是升级Xamarin(Forms)也会删除您案例中不需要的行为。

如果没有,您有两种选择:

1 - 改为使用Horizo​​ntalOptions

  

Horizo​​ntalOptions = “EndAndExpand”

因为Horizo​​ntalOptions在布局引擎中具有更高的优先级。 不是最优雅的方式,但肯定是最可靠的。

2 - 使用数据绑定

在您的模型中,只需添加以下属性:

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

在您的Xaml中,您将Horizo​​ntalAlignment更改为

  

Horizo​​ntalTextAlignment =“{Binding LabelAlignment}”

这样可行,因为在创建屏幕后,模型中的值将被加载并随后更新。

答案 1 :(得分:0)

更改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