Skip to content

Commit

Permalink
Fix regressions with NumberBox HeaderPresenter behavior (microsoft/mi…
Browse files Browse the repository at this point in the history
  • Loading branch information
Kinnara committed Apr 30, 2020
1 parent 292f7ce commit 929b4ae
Show file tree
Hide file tree
Showing 8 changed files with 298 additions and 217 deletions.
58 changes: 58 additions & 0 deletions ModernWpf.Controls/NumberBox/NumberBox.cs
Expand Up @@ -32,6 +32,7 @@ public NumberBoxValueChangedEventArgs(double oldValue, double newValue)
[TemplatePart(Name = c_numberBoxPopupUpButtonName, Type = typeof(RepeatButton))]
public partial class NumberBox : Control
{
const string c_numberBoxHeaderName = "HeaderContentPresenter";
const string c_numberBoxDownButtonName = "DownSpinButton";
const string c_numberBoxUpButtonName = "UpSpinButton";
const string c_numberBoxTextBoxName = "InputBox";
Expand Down Expand Up @@ -98,6 +99,8 @@ public override void OnApplyTemplate()
}
}

UpdateHeaderPresenterState();

m_textBox = GetTextBox();
TextBox GetTextBox()
{
Expand Down Expand Up @@ -285,6 +288,16 @@ private void UpdateValueToText()
}
}

private void OnHeaderPropertyChanged(DependencyPropertyChangedEventArgs args)
{
UpdateHeaderPresenterState();
}

private void OnHeaderTemplatePropertyChanged(DependencyPropertyChangedEventArgs args)
{
UpdateHeaderPresenterState();
}

private void OnValidationModePropertyChanged(DependencyPropertyChangedEventArgs args)
{
ValidateInput();
Expand Down Expand Up @@ -590,12 +603,57 @@ private bool IsInBounds(double value)
return value >= Minimum && value <= Maximum;
}

private void UpdateHeaderPresenterState()
{
bool shouldShowHeader = false;

// Load header presenter as late as possible

// To enable lightweight styling, collapse header presenter if there is no header specified
if (Header is { } header)
{
// Check if header is string or not
if (header is string headerAsString)
{
if (!string.IsNullOrEmpty(headerAsString))
{
// Header is not empty string
shouldShowHeader = true;
}
}
else
{
// Header is not a string, so let's show header presenter
shouldShowHeader = true;
}
}
if (HeaderTemplate is { } headerTemplate)
{
shouldShowHeader = true;
}

if (shouldShowHeader && m_headerPresenter == null)
{
if (GetTemplateChild(c_numberBoxHeaderName) is ContentPresenter headerPresenter)
{
// Set presenter to enable lightweight styling of the headers margin
m_headerPresenter = headerPresenter;
}
}

if (m_headerPresenter != null)
{
m_headerPresenter.Visibility = shouldShowHeader ? Visibility.Visible : Visibility.Collapsed;
}
}

bool m_valueUpdating = false;
bool m_textUpdating = false;

DefaultNumberRounder m_displayRounder = new DefaultNumberRounder();

TextBox m_textBox;
ContentPresenter m_headerPresenter;
Popup m_popup;
PopupRepositionHelper m_popupRepositionHelper;
}
Expand Down
18 changes: 16 additions & 2 deletions ModernWpf.Controls/NumberBox/NumberBox.properties.cs
Expand Up @@ -142,27 +142,41 @@ private static void OnTextPropertyChanged(DependencyObject sender, DependencyPro
#region Header

public static readonly DependencyProperty HeaderProperty =
ControlHelper.HeaderProperty.AddOwner(typeof(NumberBox));
ControlHelper.HeaderProperty.AddOwner(
typeof(NumberBox),
new FrameworkPropertyMetadata(OnHeaderPropertyChanged));

public object Header
{
get => GetValue(HeaderProperty);
set => SetValue(HeaderProperty, value);
}

private static void OnHeaderPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
((NumberBox)sender).OnHeaderPropertyChanged(args);
}

#endregion

#region HeaderTemplate

public static readonly DependencyProperty HeaderTemplateProperty =
ControlHelper.HeaderTemplateProperty.AddOwner(typeof(NumberBox));
ControlHelper.HeaderTemplateProperty.AddOwner(
typeof(NumberBox),
new FrameworkPropertyMetadata(OnHeaderTemplatePropertyChanged));

public DataTemplate HeaderTemplate
{
get => (DataTemplate)GetValue(HeaderTemplateProperty);
set => SetValue(HeaderTemplateProperty, value);
}

private static void OnHeaderTemplatePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
((NumberBox)sender).OnHeaderTemplatePropertyChanged(args);
}

#endregion

#region PlaceholderText
Expand Down
2 changes: 1 addition & 1 deletion ModernWpf.Controls/NumberBox/NumberBox.xaml
Expand Up @@ -324,7 +324,7 @@
Margin="{DynamicResource TextBoxTopHeaderMargin}"
TextWrapping="Wrap"
VerticalAlignment="Top"
Visibility="{TemplateBinding ui:ControlHelper.HeaderVisibility}"
Visibility="Collapsed"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />

<TextBox
Expand Down

0 comments on commit 929b4ae

Please sign in to comment.