Как зарегистрировать DependencyProperty, который должен работать с типом значения - PullRequest
0 голосов
/ 19 января 2020

В классе C ++ / CX я хочу создать DependencyProperty, который получает или устанавливает нормальный тип значения C ++ float, но я просто не могу понять, как мне нужно указать тип, ожидаемый DependencyProperty::Register .

Позвольте мне привести пример. Если бы я использовал свойство, которое работает со ссылочным типом, я поместил бы следующее в заголовочный файл моего класса C ++ / CX:

public:

  static property Windows::UI::Xaml::DependencyProperty^ BackgroundColorProperty
  {
    Windows::UI::Xaml::DependencyProperty^ get();
  };

  property Windows::UI::Xaml::Media::Brush^ BackgroundColor
  {
    Windows::UI::Xaml::Media::Brush^ get();
    void set(Windows::UI::Xaml::Media::Brush^ value);
  };

private:

  static Windows::UI::Xaml::DependencyProperty^ _backgroundColorProperty;

  static void OnBackgroundColorChanged(Windows::UI::Xaml::DependencyObject^ d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ e);

Реализация выглядела бы так:

DependencyProperty^ MyCustomClass::BackgroundColorProperty::get()
{
  return _backgroundColorProperty;
}

Windows::UI::Xaml::Media::Brush^ MyCustomClass::BackgroundColor::get()
{
  return static_cast<Windows::UI::Xaml::Media::Brush^>(GetValue(BackgroundColorProperty));
}

void MyCustomClass::BackgroundColor::set(Windows::UI::Xaml::Media::Brush^ value)
{
  SetValue(BackgroundColorProperty, value);
}

DependencyProperty^ MyCustomClass::_backgroundColorProperty =
  DependencyProperty::Register("BackgroundColor",
                               Brush::typeid,
                               MyCustomClass::typeid,
                               ref new PropertyMetadata(ref new SolidColorBrush(Windows::UI::ColorHelper::FromArgb(255, 255, 255, 255)), ref new PropertyChangedCallback(&MyCustomClass::OnBackgroundColorChanged)));

void MyCustomClass::OnBackgroundColorChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e)
{
  MyCustomClass^ myClass = static_cast<MyCustomClass^>(d);
  // Do whatever needs to be done
}

Это все работает. XAML Designer в Visual Studio распознает это свойство и все работает, как и ожидалось.

Но допустим, я хочу свойство, которое использует float вместо Brush. Как мне нужно указать необходимый тип в методе DependencyProperty::Register? Я имею в виду второй аргумент в коде ниже.

DependencyProperty^ MyCustomClass::_backgroundColorProperty =
  DependencyProperty::Register("BackgroundColor",
                               /* How do I specify the type of the float here?*/,
                               MyCustomClass::typeid,
                               ref new PropertyMetadata(1.0f, ref new PropertyChangedCallback(&MyCustomClass::OnBackgroundColorChanged)));

Я пробовал следующее, которое не сработало:

ref new TypeKind(TypeKind::Primitive, float32)
typeof(float32)
typeof(float)
typeid(float)
ref new Windows::UI::Xaml::Interop::TypeKind(TypeKind::Primitive, float)
ref new Windows::UI::Xaml::Interop::TypeKind(TypeKind::Primitive, typeid(float))

1 Ответ

1 голос
/ 20 января 2020

Вы можете напрямую использовать float::typeid для регистрации типа с плавающей точкой.

DependencyProperty^ MyCustomClass::_backgroundColorProperty =
DependencyProperty::Register("BackgroundColor",
    float::typeid,
    MyCustomClass::typeid,
    ref new PropertyMetadata(1.0f, ref new PropertyChangedCallback(&MyCustomClass::OnBackgroundColorChanged)));

Кроме того, из этого документа упоминается:

Если Вы хотите DP с типом с плавающей запятой, а затем сделайте его двойным (Double в MIDL 3.0). Объявление и реализация DP типа с плавающей запятой (Single в MIDL), а затем установка значения для этого DP в разметке XAML приводит к ошибке Failed для создания «Windows браковки.Single» из текста ''.

Поэтому я предлагаю вам использовать свойство двойной зависимости вместо float.

...