Я использую Xamarin.Forms для кроссплатформенного проекта, и мне нужно использовать нарисованные Google изображения из девяти патчей для моей кнопки входа в Google

this - одна из неправильно понятых концепций в JavaScript, потому что она ведет себя совсем не так, как с места на место. Просто this ссылается на «владельца» функции, которую мы сейчас выполняем.

this помогает получить текущий объект (контекст выполнения a.k.a.), с которым мы работаем. Если вы понимаете, в каком объекте выполняется текущая функция, вы можете легко понять, что текущий this is

var val = "window.val"

var obj = {
    val: "obj.val",
    innerMethod: function () {
        var val = "obj.val.inner",
            func = function () {
                var self = this;
                return self.val;
            };

        return func;
    },
    outerMethod: function(){
        return this.val;
    }
};

//This actually gets executed inside window object 
console.log(obj.innerMethod()()); //returns window.val

//Breakdown in to 2 lines explains this in detail
var _inn = obj.innerMethod();
console.log(_inn()); //returns window.val

console.log(obj.outerMethod()); //returns obj.val

Выше мы создаем 3 переменные с одинаковым именем «val». Один в глобальном контексте, один внутри obj и другой внутри innerMethod obj. JavaScript разрешает идентификаторы в определенном контексте, поднимая цепочку областей действия из локального глобального.


Несколько мест, где this можно дифференцировать

Вызов метода объекта

var status = 1;
var helper = {
    status : 2,
    getStatus: function () {
        return this.status;
    }
};

var theStatus1 = helper.getStatus(); //line1
console.log(theStatus1); //2

var theStatus2 = helper.getStatus;
console.log(theStatus2()); //1

Когда line1, JavaScript устанавливает контекст выполнения (EC) для вызова функции, устанавливая this объекту, на который ссылается все, что было до последнего «.». поэтому в последней строке вы можете понять, что a() был выполнен в глобальном контексте, который является window.

С конструктором

this можно использовать для ссылки на создаваемый объект

function Person(name){
    this.personName = name;
    this.sayHello = function(){
        return "Hello " + this.personName;
    }
}

var person1 = new Person('Scott');
console.log(person1.sayHello()); //Hello Scott

var person2 = new Person('Hugh');
var sayHelloP2 = person2.sayHello;
console.log(sayHelloP2()); //Hello undefined

Когда выполняется новый Person(), создается совершенно новый объект. Вызывается Person и его this установлен для ссылки на этот новый объект.

Вызов функции

function testFunc() {
    this.name = "Name";
    this.myCustomAttribute = "Custom Attribute";
    return this;
}

var whatIsThis = testFunc();
console.log(whatIsThis); //window

var whatIsThis2 = new testFunc();
console.log(whatIsThis2);  //testFunc() / object

console.log(window.myCustomAttribute); //Custom Attribute 

Если мы пропустим ключевое слово new, whatIsThis ссылается на самый глобальный контекст, он может найти (window)

С обработчиками событий

Если обработчик события является встроенным, this ссылается на глобальный объект




При добавлении обработчика событий через JavaScript, this относится к элементу DOM, который генерирует событие.


1
задан Ivica 4 March 2019 в 10:39
поделиться

1 ответ

1134 Я уже делал это раньше. Вот общее описание того, что я сделал:

  1. Поместите файлы мультиплатформенных значков в ваш проект .NetStandard как Embedded Resources . Это означает, что я нашел все различные разрешения, предоставленные Google (_xxhdpi, _xhdpi, _hdpi, _mdpi и т. Д.), А затем переименовал их в следующее:

    • icon@¾x.png
    • [ 1152] icon.png
    • icon@1½x.png
    • icon@2x.png
    • icon@3x.png
    • icon@4x.png [ 1156]

    А затем поместите их в папку Resources / Google в моем проекте ( FormsFirebase.Ui ). Так, например, EmbeddedResourceId для первого файла в приведенном выше списке - FormsFirebase.Ui.Resources.Google.icon@¾x.png.

    Как вы вскоре увидите, переименование этих файлов, как показано выше, позволит Forms9Patch.Button выбрать правильное изображение для правильного разрешения экрана (так, чтобы оно выглядело великолепно) - избавляя вас от необходимости управлять этим. Аналогично, включение их в проект .NetStandard означает, что они доступны для всех платформ - освобождая вас от необходимости разбираться с этим несколько раз!

  2. В вашем Forms9Patch.Button см. выше значок изображения в разрешении независимой моды. Это можно сделать несколькими способами. Один из более подробных способов:

    var myButton = new Forms9Patch.Button
    {
        Text = "Sign in with xxhdpi",
        TextColor=Color.White,
        FontSize=14,
        FontFamily="sans-serif",
        WidthRequest=60,
        IconImage = new Forms9Patch.Image
        {
            Source = Forms9Patch.ImageSource.FromMultiResource("FormsFirebase.Ui.Resources.Google.icon", GetType().Assembly),
            Padding = 1,
        },
        Spacing = 4,
        TintIcon = false,
        BackgroundColor = Color.FromRGB(81,134,236)
    };

Несколько замечаний:

  1. Во-первых, я установил TintIcon в false, чтобы не подкрасил значок в тот же цвет, что и TextColor. Также я установил IconImage, а не BackgroundImage. Это необходимо для того, чтобы убедиться, что изображение равноценно тексту, а не слою под ним.

  2. Также обратите внимание, что я могу установить отступы IconImage, а также Forms9Patch.Button.Padding и Forms9Patch.Button.Spacing (расстояние между IconImage и [ 1113] или HtmlText, в зависимости от того, было ли для HasTightSpacing установлено значение true).

  3. Вместо использования нескольких файлов .png (для каждого разрешения экрана), если у вас есть .svg версия вашего изображения, вы можете использовать ее вместо этого. Гораздо меньше работы!

  4. Еще одна вещь, которая может вас заинтересовать: подобно тому, как Forms9Patch обрабатывает изображения независимо от платформы (помещая их в кроссплатформенный проект в качестве встроенных ресурсов), он может сделать то же самое со шрифтами. Это означает, что вы можете поместить файл шрифта (.ttf или .otf) в ваш кроссплатформенный проект и использовать его EmbeddedResourceId в качестве значения для FontFamily. И это поведение может быть расширено до элементов Xamarin.Forms с помощью Forms9Patch.EmbeddedResourceFontEffect.

Теперь немного прозелитизма (извините, если это не относится к вам): я вижу, что вы использовали XAML в качестве примера кода. Обратите внимание, что я не в своем ответе. Если вы новичок в .Net и / или Xamarin.Forms, я настоятельно рекомендую не использовать XAML. Не поймите меня неправильно, XAML великолепен - он просто не для начинающих. Зачем? Слишком много вещей происходит под одеялом, которые, как новичок, могут сбить вас с толку и замедлить. Скорее, я бы порекомендовал вам написать весь ваш пользовательский интерфейс на C #, чтобы вы могли научиться управлять своими свойствами и узнать, как на самом деле работает привязка. Как только вы освоите создание очень эффективных макетов с наилучшим «контекстно-зависимым» использованием связывания, тогда вы готовы к XAML. Для меня настоящим тестом была возможность сделать очень сложную разметку ячейки в большом списке в ListView плавно прокручивать на недорогом телефоне Android. После этого опыта я смог воспользоваться всеми преимуществами разработки на XAML (и их немало), не беспокоясь о том, что меня сковывают мои ошибки новичка.

0
ответ дан baskren 4 March 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: