make ControlSizeTrigger works even if the control is already loaded (#738)

This commit is contained in:
Rudy Huyn 2019-10-29 15:21:32 -07:00 committed by Pepe Rivera
parent bc2d2d4e9d
commit 25cdca991c
2 changed files with 16 additions and 24 deletions

View File

@ -23,58 +23,50 @@ ControlSizeTrigger::~ControlSizeTrigger()
UnregisterSizeChanged(Source); UnregisterSizeChanged(Source);
} }
void ControlSizeTrigger::OnSourcePropertyChanged(FrameworkElement^ oldValue, FrameworkElement^ newValue) void ControlSizeTrigger::OnSourcePropertyChanged(FrameworkElement ^ oldValue, FrameworkElement ^ newValue)
{ {
UnregisterSizeChanged(oldValue); UnregisterSizeChanged(oldValue);
RegisterSizeChanged(newValue); RegisterSizeChanged(newValue);
} }
void ControlSizeTrigger::RegisterSizeChanged(FrameworkElement^ element) void ControlSizeTrigger::RegisterSizeChanged(FrameworkElement ^ element)
{ {
if (element == nullptr) { return; } if (element == nullptr)
{
return;
}
if (element != Source) if (element != Source)
{ {
UnregisterSizeChanged(Source); UnregisterSizeChanged(Source);
} }
m_sizeChangedToken = m_sizeChangedToken = element->SizeChanged += ref new SizeChangedEventHandler(this, &ControlSizeTrigger::OnSizeChanged);
element->SizeChanged += ref new SizeChangedEventHandler(this, &ControlSizeTrigger::OnSizeChanged); UpdateIsActive(element->RenderSize);
} }
void ControlSizeTrigger::UnregisterSizeChanged(FrameworkElement^ element) void ControlSizeTrigger::UnregisterSizeChanged(FrameworkElement ^ element)
{ {
if ((element != nullptr) && (m_sizeChangedToken.Value != 0)) if (element != nullptr && m_sizeChangedToken.Value != 0)
{ {
element->SizeChanged -= m_sizeChangedToken; element->SizeChanged -= m_sizeChangedToken;
m_sizeChangedToken.Value = 0; m_sizeChangedToken.Value = 0;
} }
} }
void ControlSizeTrigger::OnSizeChanged(Object^ sender, SizeChangedEventArgs^ e) void ControlSizeTrigger::OnSizeChanged(Object ^ sender, SizeChangedEventArgs ^ e)
{ {
UpdateIsActive(e->NewSize); UpdateIsActive(e->NewSize);
} }
void ControlSizeTrigger::UpdateIsActive(Size sourceSize) void ControlSizeTrigger::UpdateIsActive(Size sourceSize)
{ {
if (Source != nullptr && MinWidth > 0 || MinHeight > 0) if (MinHeight >= 0)
{ {
if (MinHeight > 0 && MinWidth > 0) SetActive(sourceSize.Height >= MinHeight && (MinWidth < 0 || sourceSize.Width >= MinWidth));
{
SetActive((sourceSize.Height >= MinHeight) && (sourceSize.Width >= MinWidth));
}
else if (MinHeight > 0)
{
SetActive(sourceSize.Height >= MinHeight);
}
else
{
SetActive(sourceSize.Width >= MinWidth);
}
} }
else else
{ {
SetActive(false); SetActive(MinWidth >= 0 && sourceSize.Width >= MinWidth);
} }
} }

View File

@ -16,9 +16,9 @@ namespace CalculatorApp::Views::StateTriggers
DEPENDENCY_PROPERTY_WITH_CALLBACK(Windows::UI::Xaml::FrameworkElement^, Source); DEPENDENCY_PROPERTY_WITH_CALLBACK(Windows::UI::Xaml::FrameworkElement^, Source);
DEPENDENCY_PROPERTY_WITH_DEFAULT(double, MinHeight, 0.0); DEPENDENCY_PROPERTY_WITH_DEFAULT(double, MinHeight, -1);
DEPENDENCY_PROPERTY_WITH_DEFAULT(double, MinWidth, 0.0); DEPENDENCY_PROPERTY_WITH_DEFAULT(double, MinWidth, -1);
private: private:
~ControlSizeTrigger(); ~ControlSizeTrigger();