Страницы

Поиск по вопросам

понедельник, 30 марта 2020 г.

Пользовательские MarkupExtension в качестве ключа словаря

#c_sharp #wpf #net #xaml


К примеру, имеем такое расширение разметки:

using System;
using System.Windows.Markup;
namespace CustomMarkupExtensions
{
    public class HelloExtension : MarkupExtension
    {
        public HelloExtension() { }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return "Hello";
        }
    }
}


Код XAML. Пытаюсь использовать расширение в качестве ключа в ResourceDictionary:



    Пример




При компиляции возникает ошибка:

(6,20): error MC3012: 
ключ словаря не может иметь тип "CustomMarkupExtensions.HelloExtension". 
Поддерживаются только типы String, TypeExtension и StaticExtension. Строка 6 позиция 20.


Хотя в описании директивы x:Key указано, что расширения разметки использоваться могут.
В чем дело?
    


Ответы

Ответ 1



В справке всё указано верно: в x:Key можно использовать расширения разметки, но только два: TypeExtension и StaticExtension. Пользовательские расширения разметки не поддерживаются, кроме наследников ResourceKey. (Также x:Key может содержать произвольное значение, но указать его можно только с помощью одного из перечисленных выше расширений разметки.) Это ограничение было снято в XAML 2009, вот только этот "стандарт" по сути не поддерживается. В XAML 2006, который, похоже, с нами навсегда, можно пойти обходным путём: положить значение в статическое свойство, затем указать его через x:Static.

Комментариев нет:

Отправить комментарий