Xamarin.forms 是否有任何控件可以在单击箭头时截断标签并显示全文
我开发了xamarin表单项目。我需要截断文本作为默认值,然后在单击按钮后显示剩余文本。当点击按钮时,文本同样需要被截断。这就像看到更多&看到更少的功能。请任何人建议我如何做到这一点。我添加了截图以供进一步参考 这是展开时的外观: 这就是它倒塌时的样子:Xamarin.forms 是否有任何控件可以在单击箭头时截断标签并显示全文,xamarin.forms,label,truncated,Xamarin.forms,Label,Truncated,我开发了xamarin表单项目。我需要截断文本作为默认值,然后在单击按钮后显示剩余文本。当点击按钮时,文本同样需要被截断。这就像看到更多&看到更少的功能。请任何人建议我如何做到这一点。我添加了截图以供进一步参考 这是展开时的外观: 这就是它倒塌时的样子: 首先,我认为你错了。向下插入符号通常用于扩展控件,反之亦然。最后由你决定,但是你应该坚持使用普通的用户体验习惯用法,除非你有很好的理由不这么做 如果一行预览文本就足够了,那么您的问题有一个非常简单的解决方案:您可以在单击视图时设置标签的Line
首先,我认为你错了。向下插入符号通常用于扩展控件,反之亦然。最后由你决定,但是你应该坚持使用普通的用户体验习惯用法,除非你有很好的理由不这么做 如果一行预览文本就足够了,那么您的问题有一个非常简单的解决方案:您可以在单击视图时设置标签的LineBreakMode: XAML: viewmodel实现INotifyPropertyChanged以通知视图属性已更改,否则在值更改时绑定视图将不会更新。由于CallerMemberNameAttribute,当省略可选参数时,调用OnPropertyChanged的属性的名称会自动传递到propertyName参数中 IsCollapsed:bool是一个助手,可以简化代码并揭示意图。调用ClickCommand的回调时,IsCollapsed被反转。更改后,我们将LineBreakMode和CaretCharacter设置为相应的值。这些设置程序依次调用PropertyChanged以引发PropertyChanged事件和UI更新。通过设置LineBreakMode,我们告诉标签截断文本或在单词处打断文本,还有其他选项 如果你需要更多的文本怎么办? 这里有一些选项你可以选择 例如,您可以将LineBreakMode固定为WordWrap,并将标签的HeightRequest设置为值>0以仅显示部分文本,将其设置为-1以显示整个文本。在这种情况下,您可以覆盖从透明到背景色的渐变,从上到下淡出文本,作为有更多文本要显示的提示 另一种选择是操纵文本本身。您可以有一个可写属性OriginalText和一个只读属性Text,然后手动截断文本
无论如何,对于这两种选择,您都必须注意跨平台扩展,这可能很容易,也可能不容易 对于最新的Xamarin Forms 3.3,标签有一个新属性MaxLines,请参阅。如果您需要在多行显示,这应该会有所帮助。感谢您的回复@Paul。但在加载页面时,文本有时会出现在两行以下。当时我不需要显示图标。当标签超过两行时,我需要截断它。当它在两行以下时,我不需要截断它,也不需要显示图标。请根据这个场景向我推荐。@MathanKumar:好吧,以平台无关的方式实现这一点要困难得多。你可以试着测量你的绳子,但这会很麻烦。这真的很有帮助。但是我使用的是listview,listview中的每个项目都有这个标签。对于平台实现来说,这似乎是一个困难的问题。有没有其他类似上述答案的方法。提前谢谢。谢谢@Paul。这真的很有帮助。对于iPad、平板电脑、小型和大型手机等各种分辨率的屏幕来说,这似乎是一个比较困难的问题。如果有什么办法的话,我真的很感激。
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Test_SO.ExpansibleControl">
<ContentView.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ClickCommand}" />
</ContentView.GestureRecognizers>
<ContentView.Content>
<Grid RowSpacing="10" Padding="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Label Text="{Binding Text}" LineBreakMode="{Binding LineBreakMode}" HorizontalOptions="StartAndExpand" />
<Label Grid.Column="1" Text="{Binding CaretCharacter}" HorizontalOptions="End" />
</Grid>
</ContentView.Content>
</ContentView>
public class ExpansibleControlViewModel : INotifyPropertyChanged
{
private char _caretCharacter;
private bool _isCollapsed;
private LineBreakMode _lineBreakMode;
private string _text;
public ExpansibleControlViewModel()
{
ClickCommand = new Command(OnClick);
}
public event PropertyChangedEventHandler PropertyChanged;
public char CaretCharacter
{
get => _caretCharacter;
private set
{
if (_caretCharacter == value)
{
return;
}
_caretCharacter = value;
OnPropertyChanged();
}
}
public Command ClickCommand { get; private set; }
public bool IsCollapsed
{
get => _isCollapsed;
set
{
_isCollapsed = value;
if (_isCollapsed)
{
LineBreakMode = LineBreakMode.TailTruncation;
CaretCharacter = '<';
}
else
{
LineBreakMode = LineBreakMode.WordWrap;
CaretCharacter = 'v';
}
}
}
public LineBreakMode LineBreakMode
{
get => _lineBreakMode;
private set
{
if (_lineBreakMode == value)
{
return;
}
_lineBreakMode = value;
OnPropertyChanged();
}
}
public string Text
{
get
{
return _text;
}
set
{
if (_text == value)
{
return;
}
_text = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void OnClick()
{
ToggleIsCollapsed();
}
private void ToggleIsCollapsed()
{
IsCollapsed = !IsCollapsed;
}
}