如何在我自己的 ContentView(自定义控件)中使用 Xamarin.Forms.Setter 类?

赛诺软件

我正在创建一个ContentView名为AutoAdaptingView. 基本上,它是一个可以处理两个View(FirstContent 和 SecondContent)的网格,它会View根据方向、屏幕高度等自动将这两个放在两行或两列中。 现在,我想创建两个附加的BindableProperty名为 PortraitSetters和 LandscapeSetters,它们是List<Setter>,以便此类的使用者可以使用 XAML 来声明 Horizo​​ntalOptions、RequestedHeight 和使用Setter. 当方向改变时,该列表将被扫描,它将使用反射来设置所有需要设置的属性。问题是,如果我使用这样的列表,它将无法编译,因为它无法从 转换stringBindableProperty.

这是我的 BindableProperty 声明:

        //
        public static readonly BindableProperty PortraitSettersProperty = BindableProperty.CreateAttached(
            "PortraitSetters",
            typeof(List<Setter>),
            typeof(AutoAdaptingView),
            null
        );

        public static List<Setter> GetPortraitSetters(BindableObject target)
        {
            return (List<Setter>)(target as View).GetValue(PortraitSettersProperty);
        }

        public static void SetPortraitSetters(BindableObject target, List<Setter> value)
        {
            (target as View).SetValue(PortraitSettersProperty, value);
        }

        //
        public static readonly BindableProperty LandscapeSettersProperty = BindableProperty.CreateAttached(
            "LandscapeSetters",
            typeof(List<Setter>),
            typeof(AutoAdaptingView),
            null
        );

        public static List<Setter> GetLandscapeSetters(BindableObject target)
        {
            return (List<Setter>)(target as View).GetValue(LandscapeSettersProperty);
        }

        public static void SetLandscapeSetters(BindableObject target, List<Setter> value)
        {
            (target as View).SetValue(LandscapeSettersProperty, value);
        }

这是一个如何使用它的示例:

<ctrl:AutoAdaptingView>
    <ctrl:AutoAdaptingView.FirstContent>
        <StackLayout Orientation="Vertical"
                     Spacing="16">

            <ctrl:AutoAdaptingView.PortraitSetters>
                <Setter Property="HorizontalOptions" Value="Center"/>
                <Setter Property="VerticalOptions" Value="Start"/>
                <Setter Property="Margin" Value="16, 100, 16, 16"/>
            </ctrl:AutoAdaptingView.PortraitSetters>

            <ctrl:AutoAdaptingView.LandscapeSetters>
                <Setter Property="HorizontalOptions" Value="Center"/>
                <Setter Property="VerticalOptions" Value="Center"/>
                <Setter Property="Margin" Value="16"/>
            </ctrl:AutoAdaptingView.LandscapeSetters>

            <!-- actual content here -->

这就是问题所在:

Cannot convert "HorizontalOptions" into Xamarin.Forms.BindableProperty

显然我不希望 XAML 神奇地理解该Property字段是指一个StackLayoutBindableProperty,但就像Style类具有TargetType允许它自动将属性名称字符串转换为实际BindableProperty对象的属性一样,应该有一种方法这允许我实施相同的。

我想到的一个解决方案是创建我自己的 Setter 类,而不是一个BindableProperty对象,它只需要一个属性名称(因为这是我在实现中实际需要的),但是我不需要在为了转换值(即"16, 100, 16, 16"new Margin(16, 100, 16, 16))?

最简单的解决方案是改用一个事件,消费者将在后面的代码中处理该事件,但这会损失代码资源分离的优势。

布鲁诺·卡塞罗

您可以在 App.xaml 中定义您的样式(全局样式)

<Style x:Key="portraitStyle" TargetType="custom:LabelEntry">
   <Setter Property="HorizontalOptions" Value="Center"/>
            <Setter Property="VerticalOptions" Value="Start"/>
            <Setter Property="Margin" Value="16, 100, 16, 16"/>
</Style>

并且,在您的视图绑定中

Style="{Binding YourProperty , Converter={ StaticResource ConvertStyleKey }}"

带转换器用于:

public class ConvertStyle : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        valueType = (YourModel)value
        if (valueType.YourProperty)
        {
            return Application.Current.Resources["portraitStyle"] as Style;
        }
        else
        {
            //other style
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Xamarin.Forms中为ContentPage使用自定义基类

来自分类Dev

如何在抽象类中使用getter和setter

来自分类Dev

我可以在Visual Studio单元测试(类库)项目中使用Xamarin.Forms.DependencyService吗?

来自分类Dev

如何在Javascript对象(类)中使用setter和getters?

来自分类Dev

如何在动态编译中使用自定义类

来自分类Dev

Xamarin.Forms-如何使用可点击的图像制作自定义视图?

来自分类Dev

如何使用Xamarin Forms自定义渲染器隐藏Android选项卡?

来自分类Dev

如何在Xamarin.Forms中使用Android控件

来自分类Dev

如何在自定义类中使用Dask

来自分类Dev

如何在XAML [Xamarin.Forms]中使用String以外的Type设置自定义属性值

来自分类Dev

如何将对象作为可绑定属性传递给Xamarin.Forms自定义控件

来自分类Dev

Xamarin Forms中的自定义控件不起作用

来自分类Dev

如何根据平台目标在自定义控件中使用不同的基类?

来自分类Dev

[Xamarin.Forms] ListView中的自定义控件

来自分类Dev

如何在Windows Forms中使用按钮控件更改在类级别定义的整数数组?

来自分类Dev

如何在抽象类中使用getter和setter

来自分类Dev

如何在数组的自定义类中使用getter和setter以及如何在json解析期间处理由于null导致的崩溃

来自分类Dev

Xamarin.Forms-如何使用可点击的图像制作自定义视图?

来自分类Dev

如何在Silex的自定义类中使用$ app?

来自分类Dev

如何在Xamarin.Forms可移植类库中使用WCF服务

来自分类Dev

如何在 Xamarin Forms 的不同版本的 Android 上使用不同的自定义渲染器?

来自分类Dev

在 Xamarin Forms 用户控件/类库中引用图像

来自分类Dev

Spring JPA 无法在 Kotlin 数据类中使用自定义 setter 映射字段

来自分类Dev

如何使用自定义类对象正确实现 lateinit 以在 android 中的 onCreate() 中使用,避免“属性 getter 或 setter 预期”错误

来自分类Dev

如何在 iOS 上使用自定义渲染器隐藏 Xamarin.Forms TableView 页眉/页脚?

来自分类Dev

如何在我自己被 ConfuserEx 混淆的类中使用 GetMethod?

来自分类Dev

Xamarin.Forms:如何在 C# 代码中使用自定义字体

来自分类Dev

我可以使用 BindableProperty 在我的 Xamarin ContentView 自定义控件中禁用按钮吗?

来自分类Dev

如何从包含视图的 Xamarin Forms 基类 Page 继承?

Related 相关文章

  1. 1

    在Xamarin.Forms中为ContentPage使用自定义基类

  2. 2

    如何在抽象类中使用getter和setter

  3. 3

    我可以在Visual Studio单元测试(类库)项目中使用Xamarin.Forms.DependencyService吗?

  4. 4

    如何在Javascript对象(类)中使用setter和getters?

  5. 5

    如何在动态编译中使用自定义类

  6. 6

    Xamarin.Forms-如何使用可点击的图像制作自定义视图?

  7. 7

    如何使用Xamarin Forms自定义渲染器隐藏Android选项卡?

  8. 8

    如何在Xamarin.Forms中使用Android控件

  9. 9

    如何在自定义类中使用Dask

  10. 10

    如何在XAML [Xamarin.Forms]中使用String以外的Type设置自定义属性值

  11. 11

    如何将对象作为可绑定属性传递给Xamarin.Forms自定义控件

  12. 12

    Xamarin Forms中的自定义控件不起作用

  13. 13

    如何根据平台目标在自定义控件中使用不同的基类?

  14. 14

    [Xamarin.Forms] ListView中的自定义控件

  15. 15

    如何在Windows Forms中使用按钮控件更改在类级别定义的整数数组?

  16. 16

    如何在抽象类中使用getter和setter

  17. 17

    如何在数组的自定义类中使用getter和setter以及如何在json解析期间处理由于null导致的崩溃

  18. 18

    Xamarin.Forms-如何使用可点击的图像制作自定义视图?

  19. 19

    如何在Silex的自定义类中使用$ app?

  20. 20

    如何在Xamarin.Forms可移植类库中使用WCF服务

  21. 21

    如何在 Xamarin Forms 的不同版本的 Android 上使用不同的自定义渲染器?

  22. 22

    在 Xamarin Forms 用户控件/类库中引用图像

  23. 23

    Spring JPA 无法在 Kotlin 数据类中使用自定义 setter 映射字段

  24. 24

    如何使用自定义类对象正确实现 lateinit 以在 android 中的 onCreate() 中使用,避免“属性 getter 或 setter 预期”错误

  25. 25

    如何在 iOS 上使用自定义渲染器隐藏 Xamarin.Forms TableView 页眉/页脚?

  26. 26

    如何在我自己被 ConfuserEx 混淆的类中使用 GetMethod?

  27. 27

    Xamarin.Forms:如何在 C# 代码中使用自定义字体

  28. 28

    我可以使用 BindableProperty 在我的 Xamarin ContentView 自定义控件中禁用按钮吗?

  29. 29

    如何从包含视图的 Xamarin Forms 基类 Page 继承?

热门标签

归档