【问题标题】:Adjust the text size in a ListView according to a parameter根据参数调整ListView中的文本大小
【发布时间】:2021-01-12 18:38:41
【问题描述】:

我的 Xamarin.Forms 应用在 Listview 中显示多个项目的名称。文章的名称通过绑定到包含这些文章的表中的名称字段 (Panier) 来显示。

我希望用户能够更改文章名称的文本大小(当屏幕分辨率较低时,名称会被截断)。

为此,我提供了一个参数表,其中包含用户选择的文本大小。

但是如何在 xaml 代码中表明这一点?

这是一些 xaml 代码:

<Label Text="{Binding Name}" 
       Margin="10,-4,0,0" FontSize="Medium" TextColor="Black" 
       FontAttributes="None"
       VerticalOptions="Start"
       Grid.Column="0"/>

所以我想替换

FontSize="Medium"

使用如下所示的指令:

FontSize="{Binding ???}"

绑定将从参数表中获取值。 但是要找到名字,我在指令后面的代码里有

BindingContext = new Panier();

Panier() 包含Name 字段,但显然不包含文本大小。 您可能需要更改 BindingContext 才能转到参数表,但在 XAML 代码中,FontSize 与 Text 位于同一位置。

总结一下:用户应该可以自己调整Listview中显示的文章名称的文字大小。

编辑给所有回答我的人:

对不起,我不是一个经验丰富的开发人员,我不明白你在为我提供什么; 我相信我会在 Panier 表中添加一个 NameFontSize 字段。因此,我可以在我的 xaml 代码中包含以下代码:

FontSize="{Binding NameFontSize}";

这个解决方案的缺点是这个额外的字段,这意味着每条记录都会有一个关于文本大小的数据,这对于表的所有记录都是相同的。对所有记录重复相同的信息没有多大意义。 如果我错了并且您提出的解决方案更有意义,请更详细地向我解释。 非常感谢。

【问题讨论】:

  • 您需要有一个您将绑定的 double 类型的属性(代替“???”)。答案可能在于您的“参数表”是如何/在哪里实现的? (我认为你没有包括在问题中。
  • 无论如何你都需要一个属性: 1. 添加一个属性; 2.定义为部分类并添加另一个; 3.定义一个继承自Panier的新类。

标签: xaml listview xamarin.forms font-size


【解决方案1】:

您可以在 ViewModel 中添加MyFontSizeMySizeName peoperty,然后您可以使用MySizeNameNamedSize.Value 设置为MyFontSize。也可以直接为MyFontSize设置doulbe值。

Xaml 代码:

<Label Text="Hello Label!" FontSize="{Binding MyFontSize}"/>

ViewModel

public class ContactViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private double myFontSize;

    public double MyFontSize
    {
        set
        {
            if (myFontSize != value)
            {
                myFontSize = value;
                OnPropertyChanged("MyFontSize");
            }
        }
        get
        {
            return myFontSize;
        }
    }

    private string mySizeName;

    public string MySizeName
    {
        set
        {
            if (mySizeName != value)
            {
                mySizeName = value;
                OnPropertyChanged("MySizeName");
                ConvertNameToSize();
                OnPropertyChanged("MyFontSize");
            }
        }
        get
        {
            return mySizeName;
        }
    }

   // convert SizeName to FontSize
    private void ConvertNameToSize()
    {
        if (mySizeName == "Default")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Header, typeof(Label));
        }
        else if (mySizeName == "Micro")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Micro, typeof(Label));
        }
        else if (mySizeName == "Small")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label));
        }
        else if (mySizeName == "Medium")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label));
        }
        else if (mySizeName == "Large")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label));
        }
        else if (mySizeName == "Body")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Body, typeof(Label));
        }
        else if (mySizeName == "Header")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Header, typeof(Label));
        }
        else if (mySizeName == "Title")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Title, typeof(Label));
        }
        else if (mySizeName == "Subtitle")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Subtitle, typeof(Label));
        }
        else if (mySizeName == "Caption")
        {
            myFontSize = Device.GetNamedSize(NamedSize.Caption, typeof(Label));
        }else
        {
            myFontSize = Device.GetNamedSize(NamedSize.Header, typeof(Label));
        }
    }


    public ContactViewModel()
    {
        // set value for test 
        mySizeName = "Large";

        ConvertNameToSize();

    }
}

如果绑定值在运行时更改,则在此处为 ViewModel 添加INotifyPropertyChanged。视图会自动更新。

效果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2014-05-04
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多