gpt4 book ai didi

xaml - 实现类似 OnPlatform/OnIdiom 的系统

转载 作者:行者123 更新时间:2023-12-05 02:57:22 24 4
gpt4 key购买 nike

我需要根据我的应用程序的语言绑定(bind)到不同的属性。我想通过 XAML 来做到这一点,并受到了 OnPlatform/OnIdiom 的启发。

所以我创建了类似 OnIdiom 的东西,但用于语言,但我不知道如何在 XAML 中的任何内容中访问它。

using ThibertApp.Resources;

namespace ThibertApp.Localization
{
public class OnLanguage<T>
{
T _EN;
T _FR;
bool _isENSet;
bool _isFRSet;

public T EN
{
get => _EN;
set
{
_EN = value;
_isENSet = true;
}
}

public T FR
{
get => _FR;
set
{
_FR = value;
_isFRSet = true;
}
}

public static implicit operator T(OnLanguage<T> onLanguage)
{
switch (AppResources.Culture.TwoLetterISOLanguageName)
{
default:
case "en":
return onLanguage._isENSet ? onLanguage.EN : default(T);
case "fr":
return onLanguage._isFRSet ? onLanguage.FR : default(T);
}
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:s="clr-namespace:ThibertApp.Resources"
xmlns:l="clr-namespace:ThibertApp.Localization;assembly=ThibertApp"
x:Class="ThibertApp.Pages.HomePage"
Title="{Binding Title}"
IconImageSource="{Binding IconImageSource}"
BackgroundColor="White"
Style="{StaticResource ThibertPage}">
<ContentPage.Content>
<StackLayout Margin="10">
<Frame CornerRadius="10"
BackgroundColor="{StaticResource ThibertGrey}">
<Entry Placeholder="{Static s:AppResources.SearchPlaceholder}">
<Entry.Text>
<l:OnLanguage EN="{Binding TextEN}" FR="{Binding TextFR}"/>
</Entry.Text>
</Entry>
</Frame>
</StackLayout>
</ContentPage.Content>
</ContentPage>

当我引用我的类并尝试输入值时,它给出了这些错误。

Severity Code Description Project File Line Suppression State Error XLS0504 Property 'Text' does not support values of type 'OnLanguage'. ThibertApp HomePage.xaml 17

Severity Code Description Project File Line Suppression State Error Position 17:26. Type l:OnLanguage not found in xmlns clr-namespace:ThibertApp.Localization ThibertApp C:\Users\william_d\source\repos\ThibertApp\ThibertApp\ThibertApp\Pages\HomePage.xaml 17

有没有人对如何实现这一点有任何指导方针?我克隆了 Xamarin.Forms 并查找了对 OnIdiom/OnPlatform 的引用,但没有找到很多可以回答我的问题的东西。

非常感谢

编辑

有了 Deczaloth 的回答,我能够想出这样的标记扩展:

    public class OnLanguage : BindableObject, IMarkupExtension<string>
{
public readonly static BindableProperty ENProperty = BindableProperty.Create(nameof(EN), typeof(string), typeof(OnLanguage));
public string EN
{
get => GetValue(ENProperty) as string;
set => SetValue(ENProperty, value);
}

public readonly static BindableProperty FRProperty = BindableProperty.Create(nameof(FR), typeof(string), typeof(OnLanguage));
public string FR
{
get => GetValue(FRProperty) as string;
set => SetValue(FRProperty, value);
}

public string ProvideValue(IServiceProvider serviceProvider)
{
SetBinding(BindingContextProperty, new Binding("BindingContext", source: (serviceProvider.GetService<IProvideValueTarget>() as IProvideValueTarget).TargetObject as BindableObject));
return LanguageManager.LocalizedObject(EN, FR);
}

object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (this as IMarkupExtension<string>).ProvideValue(serviceProvider);
}
}

这就是我在 XAML 中实现它的方式:

                                        <Label TextColor="{StaticResource SecondaryTextColor}">
<Label.Text>
<other:OnLanguage EN="{Binding DescriptionEN}"
FR="{Binding DescriptionFR}"/>
</Label.Text>
</Label>

我的 OnLanguage BindableObject 不会自动获取 BindingContext。我已经手动实现了这一点,但如何实现才能在 BindingContext 更改时将值重新提供给父级?

最佳答案

您可能在谈论标记扩展

你需要让你的类 OnLanguage 继承自 IMarkupExtension 就像

public class OnLanguage<T> : IMarkupExtension<T>

请引用以下博文:

https://xamgirl.com/xaml-markup-extension-in-xamarin-forms/

关于xaml - 实现类似 OnPlatform/OnIdiom 的系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59758544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com