相互依赖的Windows运行时依赖项属性

时间:2020-05-14 18:41:04

标签: windows-runtime dependency-properties c++-cx

我有一个用C ++ / CX编写的Windows运行时组件,其中包含四个依赖项属性。这些属性中的三个将基础渲染器中的颜色通道设置为红色,绿色和蓝色。一种此类属性的C ++ / C代码如下所示:

uint8_t DemoControl::Red::get()
{
  return static_cast<uint8_t>(GetValue(RedProperty));
}

void DemoControl::Red::set(uint8_t r)
{
  SetValue(RedProperty, r);
}

DependencyProperty^ DemoControl::_redProperty =
  DependencyProperty::Register("Red",
                               uint_t::typeid,
                               DemoControl::typeid,
                               ref new PropertyMetadata(127, ref new PropertyChangedCallback(&DemoControl::OnRedChanged)));

void DemoControl::OnRedChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e)
{
  DemoControl^ DemoControl = static_cast<DemoControl^>(d);
  DemoControl->renderer->SetRed(static_cast<uint8_t>(e->NewValue));
}

第四个属性返回整个颜色,即它是其他三个属性的值的组合。

问题是,如果红色,绿色或蓝色属性发生更改而又不触发通过数据绑定附加到color属性的代码,我将如何更新该color属性?

有人问过类似的问题here,但对于WPF。答案建议使用value coercion,但这似乎是Windows运行时组件不可用的功能。据我所见,注册依赖项属性时使用的PropertyMetadata对象不支持CoerceValueCallback

1 个答案:

答案 0 :(得分:0)

我不是C ++专家,但至少对于您的情况,我认为我可以帮忙。

您可以为多个依赖项属性注册相同的回调。因此,在您的特定情况下,您可能只有一个OnColorComponentChanged回调:

void DemoControl::OnColorComponentChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e)
{
  DemoControl^ DemoControl = static_cast<DemoControl^>(d);

  if (e->Property == DemoControl::RedProperty) // Hand Wave Syntax Here
  {
    DemoControl->renderer->SetRed(static_cast<uint8_t>(e->NewValue));
  }
  else if (e->Property == DemoControl::GreenProperty)
  {
    DemoControl->renderer->SetGreen(static_cast<uint8_t>(e->NewValue));  
  }
  else if (e->Property == DemoControl::BlueProperty)
  {
    DemoControl->renderer->SetBlue(static_cast<uint8_t>(e->NewValue));  
  }

  // Hand Wave Here
  DemoControl->Color = MakeColor(DemoControl->Red, DemoControl->Green, DemoControl->Blue);
}