Я пытаюсь импортировать в свое приложение два пользовательских шрифта. На данный момент я добавил шрифты в каталоги .Droid/Assets и .iOS/Resources соответственно, а для iOS загрузил их в свой Info.plist.

В моем App.xaml я делаю следующее, чтобы загрузить шрифты в свой PCL:

<Application.Resources>
    <ResourceDictionary>
        <Style x:Name="BoldFont" TargetType="Label">
            <Setter Property="Label.FontFamily">
                <Setter.Value>
                    <OnPlatform x:TypeArguments="x:String">
                        <OnPlatform.Android>PT_Sans-Narrow-Web-Regular.ttf#PT Sans Narrow</OnPlatform.Android>
                        <OnPlatform.iOS>PT Sans Narrow</OnPlatform.iOS>
                    </OnPlatform>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
</Application.Resources>

Однако я хочу иметь возможность использовать несколько шрифтов в своих ярлыках, поэтому я добавил в свой <ResourceDictionary> следующий код:

<Style x:Name="RegularFont" TargetType="Label">
    <Setter Property="Label.FontFamily">
        <Setter.Value>
            <OnPlatform x:TypeArguments="x:String">
                <OnPlatform.Android>RobotoCondensed-Regular.ttf#Roboto Condensed</OnPlatform.Android>
                <OnPlatform.iOS>Roboto Condensed</OnPlatform.iOS>
            </OnPlatform>
        </Setter.Value>
    </Setter>
</Style>

К сожалению, я получаю сообщение об ошибке:

Ресурс с ключом Xamarin.Forms.Label уже присутствует в ResourceDictionary.

Кроме того, действительно ли я должен делать свой TargetType специфичным для метки, если, скажем, я хочу использовать шрифты глобально, независимо от того, Label это или Entry?

0
Jeppe Christensen 28 Апр 2018 в 00:55

1 ответ

Лучший ответ

Во-первых, в Style используйте x: Key вместо x: Name. Это позволит избежать появления сообщения об ошибке.

<Style x:Key="RegularFont" TargetType="Label">
    <Setter Property="Label.FontFamily">
        <Setter.Value>
            <OnPlatform x:TypeArguments="x:String">
                <OnPlatform.Android>RobotoCondensed-Regular.ttf#Roboto Condensed</OnPlatform.Android>
                <OnPlatform.iOS>Roboto Condensed</OnPlatform.iOS>
            </OnPlatform>
        </Setter.Value>
    </Setter>
</Style>

Иногда вы можете использовать определения стилей для разных типов. Лучший способ сделать это - использовать TargetType, который является общим базовым классом, определяющим свойства, которые вы хотите установить. К сожалению, такого общего базового класса между Label и Entry нет. Каждый из них независимо определяет FontFamily.

0
DavidS 28 Апр 2018 в 01:11