Ошибка xamarin на производном элементе управления и шаблоне содержимого собственного стиля - PullRequest
0 голосов
/ 10 апреля 2020

Я работал над приложением Android, используя Xamarin. Большинство работает нормально, но теперь я застрял в производном элементе управления и пытаюсь применить к нему пользовательский «ControlTemplate». Я сделал сложные пользовательские элементы управления в C # / WPF, но, похоже, не похоже на работу под Xamarin. Надеюсь, что-то простое.

Код позже, но предпосылка. Я получаю элемент управления «Entry» (текстовое поле) для «MyTextboxEntry». Этот класс будет иметь привязываемое свойство "IsRequired" (bool). Если требуется контроль ввода текста, я хочу показать метку «*» перед текстовым полем и сделать фоновый цвет синим. Опять же, это просто ПРОСТОЙ пример того, к чему я стремлюсь.

Насколько это возможно ...

КЛАСС, полученный из записи с BindableProperty

namespace MyAndroidApp
{
    public class MyTextboxEntry : Entry
    {
        public MyTextboxEntry()
        {}

        public static readonly BindableProperty IsRequiredProperty 
            = BindableProperty.Create(nameof(IsRequired), typeof(bool),
                typeof(MyTextboxEntry), false, BindingMode.TwoWay);
        public bool IsRequired
        {
            get { return (bool)GetValue(IsRequiredProperty); }
            set { SetValue(IsRequiredProperty, value); }
        }
    }
}

xmlns в открытии страницы содержимого, чтобы квалифицировать пространство имен для класса ...

xmlns:myCtrls="clr-namespace:MyAndroidApp"

На моей странице содержимого я заглушил попытки создания триггеров / шаблона управления но терпит неудачу.

<ContentPage.Resources>
    <Style TargetType="myCtrls:MyTextboxEntry" >
        <Style.Setters>
            <Setter Property="TextColor" Value="Blue" />
            <Setter Property="BackgroundColor" Value="Yellow" />

            <!--<Setter Property="ControlTemplate" >
                <Setter.Value>
                    <ContentPresenter />
                </Setter.Value>
            </Setter>-->
        </Style.Setters>
        <!--<Style.Triggers>
            <Trigger Property="IsRequired" Value="True">
                <Setter Property="BackgroundColor" Value="Red" />
            </Trigger>
        </Style.Triggers>-->
    </Style>

</ContentPage.Resources>

И, наконец, внутри самой страницы контента

<StackLayout>
    <myCtrls:MyTextboxEntry Text="My Sample Text"
        IsRequired="True" />    
</StackLayout>

Во-первых, в области комментариев о «ControlTemplate» и «ContentPresenter» я, очевидно, хочу определить подконтекст элемента управления для отображения «*», а затем элемент управления вводом текстового поля, основанный на триггере «IsRequired» = true.

Если я раскомментирую область ControlTemplate, программа не будет скомпилирована, с ней произойдет сбой. Msgstr "Невозможно разрешить ControlTemplate для MyTextboxEntry".

Без явного шаблона элемента управления, по крайней мере, отображается раскраска (хотя basi c), поэтому я знаю, что все остальное установлено правильно, а свойство привязки корректно, поскольку синтаксис xaml распознает его как заполнено без ошибок.

Опять же, надеюсь, что-то глупое-простое я пропустил, но попытался довести его до минимума в совершенно новом "пустом" проекте только с главной страницей.

...