Эффект Xamarin, влияющий на другие элементы управления - PullRequest
1 голос
/ 21 апреля 2019

У меня странная ошибка, когда пользовательский эффект влиял бы и на другие элементы управления, в то время как я нацеливался только на один конкретный элемент управления. Мне удалось воспроизвести поведение в небольшом тестовом проекте. То, чего я пытаюсь добиться, это изменить цвет определенного элемента управления вводом. Это работает, но при переходе на предыдущую страницу эффект влияет и на другие элементы управления, в то время как я хочу, чтобы только конкретный эффект влиял на конкретный элемент управления. Я также только добавляю эффект к определенной записи, используя список эффектов из xaml.

(обратите внимание, я использую стандартную страницу навигации по формам для навигации, определенной в моем app.xaml следующим образом.

MainPage = new NavigationPage(new MainPage());

MainPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App2"
             x:Class="App2.MainPage">
    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Welcome to Xamarin.Forms!" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
        <Entry></Entry>
        <Button Clicked="Button_Clicked"  Text="navigate"></Button>
        <Button Clicked="Button_Clicked2"  Text="navigate to other"></Button>
    </StackLayout>
</ContentPage>

CodeBehind of MainPage.xaml

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        Application.Current.MainPage.Navigation.PushAsync(new Test());
    }

    private void Button_Clicked2(object sender, EventArgs e)
    {
        Application.Current.MainPage.Navigation.PushAsync(new Test2());
    }
}

Test.Xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App2"
             x:Class="App2.Test">
    <ContentPage.Content>
        <Entry>
            <Entry.Effects>
                <local:EntryLineColorEffect></local:EntryLineColorEffect>
            </Entry.Effects>
        </Entry>
  </ContentPage.Content>
</ContentPage>

Test2.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App2.Test2">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="test 2" />
            <Entry>
            </Entry>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

EntryLineColorEffect (проект формы)

public class EntryLineColorEffect : RoutingEffect
{
    public EntryLineColorEffect() : base("Prolang.EntryLineColorEffect")
    {
    }
}

EntryLineColorEffect (проект Android)

[assembly: ResolutionGroupName("Prolang")]
[assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")]
namespace App2.Droid.Effects
{
    class EntryLineColorEffect : PlatformEffect
    {
        EditText control;

        protected override void OnAttached()
        {
            control = Control as EditText;
            UpdateLineColor();
        }

        protected override void OnDetached()
        {
            control = null;
        }

        private void UpdateLineColor()
        {
            if (control != null)
            {
                control.Background.SetColorFilter(Color.DarkMagenta.ToAndroid(), Android.Graphics.PorterDuff.Mode.SrcAtop);
            }
        }
    }
}

некоторые скриншоты, которые делают его более понятным

MainPage

TestPage Вход получает пурпурный цвет, который хорош

Test2Page

Но при переходе назад и затем на страницу Test2 эта запись также получает пурпурный цвет, что для меня является нежелательным поведением (и я не знаю, почему это происходит). Так что же мне делать, чтобы избежать такого поведения?

1 Ответ

0 голосов
/ 28 апреля 2019

В конце концов, кто-то на форуме Хамаринского сообщества смог ответить на мой вопрос.

=> Эффект не повлияет на другие элементы управления, которые не прикрепили этот эффект. Кажется, Background.SetColorFilter(Color.DarkMagenta.ToAndroid(), Android.Graphics.PorterDuff.Mode.SrcAtop); меняет цвет подчеркивания глобальной записи. Запись, отображаемая позже после этого параметра, будет применять это поведение. Таким образом, ваша запись в Test2 все еще имеет аттрактированный стиль. Вместо этого используйте Background.Mutate().SetColorFilter(Color.DarkMagenta.ToAndroid(), Android.Graphics.PorterDuff.Mode.SrcAtop);, чтобы исправить это:

EditText control;

protected override void OnAttached()
{
    control = Control as EditText;
    UpdateLineColor();
}

protected override void OnDetached()
{
    control = null;
}

private void UpdateLineColor()
{
    if (control != null)
    {
        control.Background.Mutate().SetColorFilter(Color.DarkMagenta.ToAndroid(), Android.Graphics.PorterDuff.Mode.SrcAtop);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...