StaticResource в MarkupExtension

В настоящее время я пытаюсь использовать статический ресурс с расширением для свойства FontSize моей записи. У меня есть этот фрагмент кода:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="PROJECT.Sources.Pages.Extras.EditProfilePage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:control="clr-namespace:PROJECT.Sources.Controls;assembly=PROJECT"
    xmlns:extension="clr-namespace:PROJECT.Sources.Extensions;assembly=PROJECT"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <ContentPage.Resources>
        <ResourceDictionary>
            <Color x:Key="NL_BlueNight">#0E1728</Color>
            <Color x:Key="NL_OrangeBeer">#E87E07</Color>
            <Color x:Key="NL_OrangeSky">#BD4327</Color>
            <Color x:Key="NL_White">#ECECEC</Color>
            <sys:Double x:Key="EntryFontSize">20</sys:Double>
        </ResourceDictionary>
    </ContentPage.Resources>

    <ContentPage.Content>
        <AbsoluteLayout BackgroundColor="{x:StaticResource NL_BlueNight}">
            <AbsoluteLayout
                Margin="{Binding LayoutThicknessAdapter}"
                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                AbsoluteLayout.LayoutFlags="All"
                BackgroundColor="Black">
                <control:Gif
                    AbsoluteLayout.LayoutBounds="0.5, 0, 1, 0.9"
                    AbsoluteLayout.LayoutFlags="All"
                    GifSource="Gifs/LoginBackground.gif" />
                <BoxView
                    AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                    AbsoluteLayout.LayoutFlags="All"
                    BackgroundColor="Transparent" />
            </AbsoluteLayout>

            <AbsoluteLayout
                Margin="{Binding LayoutThicknessAdapter}"
                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                AbsoluteLayout.LayoutFlags="All"
                BackgroundColor="{StaticResource NL_BlueNight}"
                Opacity="0.8">
                <ScrollView AbsoluteLayout.LayoutBounds="0.5, 0, 1, 0.9" AbsoluteLayout.LayoutFlags="All">
                    <StackLayout
                        HorizontalOptions="Fill"
                        Orientation="Vertical"
                        Spacing="15"
                        VerticalOptions="CenterAndExpand">
                        <BoxView BackgroundColor="Transparent" HeightRequest="{Binding SeparatorHeight}" />
                        <control:CustomImageCircle
                            x:Name="UserProfileImageButton"
                            HeightRequest="{Binding PictureHeightWidth}"
                            HorizontalOptions="Center"
                            Source="{Binding CurrentUser.ImageProfile}"
                            VerticalOptions="Center"
                            WidthRequest="{Binding PictureHeightWidth}" />
                        <Image
                            HeightRequest="{Binding SeparatorHeight}"
                            HorizontalOptions="Center"
                            Source="{extension:ImageSource LogoPROJECT.png}" />
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                Placeholder="pseudo"
                                PlaceholderColor="Gray"
                                Text="{Binding CurrentUser.Pseudo}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                Placeholder="email"
                                PlaceholderColor="Gray"
                                Text="{Binding CurrentUser.Email}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                Placeholder="firstname"
                                PlaceholderColor="Gray"
                                Text="{Binding CurrentUser.Firstname}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                Placeholder="lastname"
                                PlaceholderColor="Gray"
                                Text="{Binding CurrentUser.Lastname}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                Keyboard="Telephone"
                                Placeholder="phone number"
                                PlaceholderColor="Gray"
                                Text="{Binding CurrentUser.Number}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                IsPassword="True"
                                Placeholder="password"
                                PlaceholderColor="Gray"
                                Text="{Binding PasswordOne}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                        <AbsoluteLayout HeightRequest="{Binding EntryHeight}" WidthRequest="{Binding EntryWidth}">
                            <control:CustomEntry
                                AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                                AbsoluteLayout.LayoutFlags="All"
                                BackgroundColor="Transparent"
                                FontFamily="{extension:FontFamily Roboto_Light}"
                                FontSize="{extention:FontSize StaticResourceKey=EntryFontSize}}"
                                HasBorder="false"
                                IsPassword="True"
                                Placeholder="password (retype)"
                                PlaceholderColor="Gray"
                                Text="{Binding PasswordTwo}"
                                TextColor="White"
                                XAlign="Center" />
                            <!--<BoxView
                                AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 1"
                                AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional"
                                BackgroundColor="{StaticResource NL_OrangeBeer}" />-->
                        </AbsoluteLayout>
                    </StackLayout>
                </ScrollView>
                <AbsoluteLayout
                    AbsoluteLayout.LayoutBounds="0.5,1,1,0.1"
                    AbsoluteLayout.LayoutFlags="All"
                    BackgroundColor="{StaticResource NL_OrangeBeer}">
                    <control:CustomLabel
                        AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                        AbsoluteLayout.LayoutFlags="All"
                        FontFamily="{extension:FontFamily Roboto_Light}"
                        FontSize="35"
                        HorizontalTextAlignment="Center"
                        Text="Save and Return"
                        TextColor="White"
                        VerticalTextAlignment="Center" />
                    <control:CustomButton
                        AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                        AbsoluteLayout.LayoutFlags="All"
                        BackgroundColor="Transparent"
                        BorderColor="Transparent"
                        Clicked="OnSaveClicked" />
                </AbsoluteLayout>
                <AbsoluteLayout
                    AbsoluteLayout.LayoutBounds="0, 0, 0.1, 0.1"
                    AbsoluteLayout.LayoutFlags="All"
                    BackgroundColor="Transparent"
                    IsVisible="{Binding IsReturnVisible}">
                    <control:CustomImage
                        AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.8, 0.8"
                        AbsoluteLayout.LayoutFlags="All"
                        Aspect="AspectFit"
                        Source="{extension:ImageSource cross.png}" />
                    <control:CustomButton
                        AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                        AbsoluteLayout.LayoutFlags="All"
                        BackgroundColor="Transparent"
                        BorderColor="Transparent"
                        Clicked="OnReturnClicked" />
                </AbsoluteLayout>
            </AbsoluteLayout>
        </AbsoluteLayout>
    </ContentPage.Content>
</ContentPage>

Откуда extension:FontSize:

[ContentProperty("FontSize")]
public class FontSizeExtension : IMarkupExtension
{
    public double FontSize { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return Services.Sizing.FontSizeAdapter(FontSize);
    }
}

Размеры.cs

public class Sizing
{
    public static double FontSizeAdapter(double fontSize)
    {
        switch (Device.RuntimePlatform)
        {
            case "Android":
                return (fontSize / 2);
            case "iOS":
                return fontSize;
            case "Windows":
            case "WinPhone":
                return fontSize;
            default:
                return fontSize;
        }
    }
}

Однако, когда я делаю FontSize="{extention:FontSize {x:StaticResource EntryFontSize}}", выдается исключение, в котором говорится, что значение не может быть нулевым. Как я могу использовать оба одновременно? Я имею в виду x:StaticResource и Расширение.

Благодарить !


person Emixam23    schedule 17.08.2017    source источник


Ответы (1)


Редактировать - 18.08

<сильный>1. Убедитесь, что префикс правильно определен и используется

Убедитесь, что пространство имен, предоставленное для префикса, правильно для вашего расширения разметки, и что при указании префикса нет орфографической ошибки. Это должно устранить ошибку «Значение не может быть нулевым».

<сильный>2. Укажите имя свойства при использовании вложенных расширений разметки

При использовании вложенного расширения разметки необходимо указать имя свойства расширения. В противном случае, как показывают мои тесты, оно обрабатывается как строковое значение и назначается свойству содержимого по умолчанию. Это должно устранить ошибку «Входная строка имеет неверный формат».


Решение 1. Укажите имя свойства

<control:CustomEntry
       AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
       AbsoluteLayout.Flags="All"
   ...
       FontSize="{extension:FontSize FontSize={x:StaticResource EntryFontSize}}"
   .../>

Решение 2. Вы можете еще больше упростить это, добавив свойство StaticResourceKey в расширение разметки:

[ContentProperty("FontSize")]
public class FontSizeExtension : IMarkupExtension
{
    public double FontSize { get; set; }
    public string StaticResourceKey { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (serviceProvider == null)
            throw new ArgumentNullException(nameof(serviceProvider));

        if (StaticResourceKey != null)
        {
            var staticResourceExtension = new StaticResourceExtension { Key = StaticResourceKey };
            FontSize = (double)staticResourceExtension.ProvideValue(serviceProvider);
        }

        return Services.Sizing.FontSizeAdapter(FontSize);
    }
}

и использование может быть:

   ...
       FontSize="{extension:FontSize StaticResourceKey=EntryFontSize}}"
   ...
person Sharada Gururaj    schedule 18.08.2017
comment
Спасибо. FontSize="{extention:FontSize FontSize={x:StaticResource EntryFontSize}}" все еще выдает значение. Значение не может быть нулевым. Я попробую второе решение! - person Emixam23; 18.08.2017
comment
Вы видите эту ошибку во время выполнения или во время компиляции? Потому что я тоже тестировал первое решение — оно сработало, как и ожидалось! - person Sharada Gururaj; 18.08.2017
comment
Второй тоже не работает! Что?? Это происходит во время компиляции, я на Mac OS, вы думаете, это может быть проблемой? так странно.. когда я возвращаю FontSize=20, он отлично компилируется - person Emixam23; 18.08.2017
comment
../EditProfilePage.xaml: Ошибка: значение не может быть нулевым. Имя параметра: clrNamespace (ПРОЕКТ) - person Emixam23; 18.08.2017
comment
Я тестировал этот код и в MacOS — он работал. Позвольте мне посмотреть, может ли XamlCompilation быть проблемой здесь. Какую версию форм вы используете? - person Sharada Gururaj; 18.08.2017
comment
Итак, я отредактировал код xaml и дал вам полный код, не знаю, может ли это помочь! Xamarin.Forms 2.3.4.267 - person Emixam23; 18.08.2017
comment
Хорошо - удалось воспроизвести ошибку с помощью предоставленного вами кода. Я считаю, что у вас есть проблема несоответствия пространства имен для ваших расширений разметки. (Если я преднамеренно укажу неправильное пространство имен - я получаю эту ошибку) - person Sharada Gururaj; 18.08.2017
comment
Так глупо... Посмотрите на мой вопрос и ваш ответ... Я имею в виду написание extension.. - person Emixam23; 18.08.2017
comment
Стрелять! Исправлено. - person Sharada Gururaj; 18.08.2017
comment
Итак, подведем итог: код, которым вы изначально поделились, имел две проблемы: 1. Орфографическая ошибка в расширении, которая вызвала ошибку «значение не может быть нулевым»; 2. Вложенная разметка без имени свойства, которая вызывала ошибку «Входная строка имела неверный формат». Надеюсь, теперь обе проблемы устранены. - person Sharada Gururaj; 18.08.2017
comment
Да ! теперь это работает, спасибо, но вы должны отредактировать свой основной ответ с правильным решением, чтобы членам сообщества было легче читать :) - person Emixam23; 18.08.2017