Xamarin формирует подсказки UWP - PullRequest
2 голосов
/ 02 апреля 2020

Я хотел бы добавить всплывающие подсказки в Xamarin для UWP с помощью собственного представления и пакета Nuget Windows .UI.Xaml. Я добавил следующую ссылку на страницу xaml для получения собственного вида windows:

<ContentPage 

             xmlns:win="clr-namespace:Windows.UI.Xaml.Controls;assembly=Windows, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime;targetPlatform=Windows"   

</ContentPage>

Я могу успешно получить доступ к собственным элементам управления windows, например, TextBlock:

<    win: TextBlock Text="S"/>

Однако, когда я пытаюсь добавить всплывающую подсказку к элементу управления:

<win:TextBlock Text="S" ToolTipService.ToolTip="Service agreement"/>

я получаю следующее исключение во время компиляции:

"Xamarin.Forms.Xaml.XamlParseException: ' Позиция 56:45. Тип ToolTipService не найден в xmlns http://xamarin.com/schemas/2014/forms '"

Запутывается ли система между стандартным пространством имен Windows .UI.Xaml.Controls и расширенный из пакета Nuget?

1 Ответ

1 голос
/ 02 апреля 2020

ToolTipService является вложенным свойством, и оно не найдет сборку ToolTipService в клиенте Forms, лучше использовать Effect для создания собственного сервиса подсказок и его рендеринга на платформе UWP. Вы можете сослаться на следующие шаги:

  • Создать подкласс класса PlatformEffect.

  • Переопределить Метод OnAttached и запись logi c для настройки элемента управления.

  • Переопределите метод OnDetached и введите logi c, чтобы очистить настройку элемента управления, если требуется .

  • Добавьте атрибут ResolutionGroupName к классу эффекта. Этот атрибут задает пространство имен компании для эффектов, предотвращая столкновения с другими эффектами с таким же именем. Обратите внимание, что этот атрибут может применяться только один раз для каждого проекта.

  • Добавьте атрибут ExportEffect в класс эффекта. Этот атрибут регистрирует эффект с уникальным идентификатором, который используется Xamarin.Forms, вместе с именем группы, чтобы найти эффект до его применения к элементу управления. Атрибут принимает два параметра - имя типа эффекта и уникальную строку, которая будет использоваться для определения местоположения эффекта до его применения к элементу управления.

Кодовая часть UWP

[assembly: ResolutionGroupName("Microsoft")]
[assembly: ExportEffect(typeof(UWPToolTipEffect), nameof(TooltipEffect))]

namespace NativeSwitch.UWP
{
    public class UWPToolTipEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            var control = Control ?? Container;

            if (control is DependencyObject)
            {
                ToolTip toolTip = new ToolTip();
                toolTip.Content = TooltipEffect.GetText(Element);
                switch (TooltipEffect.GetPosition(Element))
                {
                    case TooltipPosition.Bottom:
                        toolTip.Placement = Windows.UI.Xaml.Controls.Primitives.PlacementMode.Bottom;
                        break;
                    case TooltipPosition.Top:
                        toolTip.Placement = Windows.UI.Xaml.Controls.Primitives.PlacementMode.Top;
                        break;
                    case TooltipPosition.Left:
                        toolTip.Placement = Windows.UI.Xaml.Controls.Primitives.PlacementMode.Left;
                        break;
                    case TooltipPosition.Right:
                        toolTip.Placement = Windows.UI.Xaml.Controls.Primitives.PlacementMode.Right;
                        break;
                    default:
                        return;
                }
                ToolTipService.SetToolTip(control, toolTip);
            }

        }

        protected override void OnDetached()
        {

        }
    }
}

Кодовая часть форм

public static class TooltipEffect
{

    public static readonly BindableProperty TextProperty =
      BindableProperty.CreateAttached("Text", typeof(string), typeof(TooltipEffect), string.Empty, propertyChanged: OnTextChanged);

    public static readonly BindableProperty PositionProperty =
      BindableProperty.CreateAttached("Position", typeof(TooltipPosition), typeof(TooltipEffect), TooltipPosition.Bottom);


    public static string GetText(BindableObject view)
    {
        return (string)view.GetValue(TextProperty);
    }

    public static void SetText(BindableObject view, string value)
    {
        view.SetValue(TextProperty, value);
    }

    public static TooltipPosition GetPosition(BindableObject view)
    {
        return (TooltipPosition)view.GetValue(PositionProperty);
    }

    public static void SetPosition(BindableObject view, TooltipPosition value)
    {
        view.SetValue(PositionProperty, value);
    }

    static void OnTextChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var view = bindable as View;
        if (view == null)
        {
            return;
        }

        string text = (string)newValue;
        if (!string.IsNullOrEmpty(text))
        {
            view.Effects.Add(new ControlTooltipEffect());
        }
        else
        {
            var toRemove = view.Effects.FirstOrDefault(e => e is ControlTooltipEffect);
            if (toRemove != null)
            {
                view.Effects.Remove(toRemove);
            }
        }
    }

}

public enum TooltipPosition
{
    Bottom,

    Right,

    Left,

    Top
}

class ControlTooltipEffect : RoutingEffect
{
    public ControlTooltipEffect() : base($"Microsoft.{nameof(TooltipEffect)}")
    {

    }
}

Использование

// forms project namesapce
xmlns:effects="clr-namespace:ToolTipTestApp"
......

<win:TextBlock
    effects:TooltipEffect.Position="Right"
    effects:TooltipEffect.Text="Hello"
    Text="Hello Wrold"
    />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...