Xamarin.forms 是否有任何控件可以在单击箭头时截断标签并显示全文

Xamarin.forms 是否有任何控件可以在单击箭头时截断标签并显示全文,xamarin.forms,label,truncated,Xamarin.forms,Label,Truncated,我开发了xamarin表单项目。我需要截断文本作为默认值,然后在单击按钮后显示剩余文本。当点击按钮时,文本同样需要被截断。这就像看到更多&看到更少的功能。请任何人建议我如何做到这一点。我添加了截图以供进一步参考 这是展开时的外观: 这就是它倒塌时的样子: 首先,我认为你错了。向下插入符号通常用于扩展控件,反之亦然。最后由你决定,但是你应该坚持使用普通的用户体验习惯用法,除非你有很好的理由不这么做 如果一行预览文本就足够了,那么您的问题有一个非常简单的解决方案:您可以在单击视图时设置标签的Line

我开发了xamarin表单项目。我需要截断文本作为默认值,然后在单击按钮后显示剩余文本。当点击按钮时,文本同样需要被截断。这就像看到更多&看到更少的功能。请任何人建议我如何做到这一点。我添加了截图以供进一步参考

这是展开时的外观:

这就是它倒塌时的样子:


首先,我认为你错了。向下插入符号通常用于扩展控件,反之亦然。最后由你决定,但是你应该坚持使用普通的用户体验习惯用法,除非你有很好的理由不这么做

如果一行预览文本就足够了,那么您的问题有一个非常简单的解决方案:您可以在单击视图时设置标签的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;
    }
}