我创建了一个简单的应用程序,用户可以在部分中看到更多信息,如果他们选中了标签,可以在下面的图片中看到。
问题是,导航到AnotherPage
并返回后,文本会向左移动,即使我已将HorizontalTextAlignment
设置为End
。
这只会发生,当我显示该部分并再次隐藏它(通过点击标签两次)。
问题如下图所示,其中y
位于左侧。
修改 的 添加了代码示例
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
只是显示文字,例如
答案 0 :(得分:0)
首先,我无法使用最新版本的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}”
这样可行,因为在创建屏幕后,模型中的值将被加载并随后更新。
答案 1 :(得分:0)
更改HorizontalOptions="FillAndExpand"
至HorizontalOptions="CenterAndExpand"
这将强制文本从中心展开并放在最后。
要强制文本在右侧,您可以向网格添加另一个列定义:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
将对象放置到第一个单元格中,即左侧的单元格:
和你的标签进入第二个单元格,右边的那个:
文本区域将调整为文本长度,并始终位于右侧。
我希望这些信息有所帮助!
您可以在文档中阅读有关网格的更多信息: https://docs.microsoft.com/en-us/xamarin/android/user-interface/layouts/grid-layout