зеркало из https://github.com/DeGsoft/maui-linux.git
167 строки
4.5 KiB
C#
167 строки
4.5 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Linq;
|
|
using global::Windows.UI.Xaml;
|
|
using global::Windows.UI.Xaml.Controls;
|
|
using global::Windows.UI.Text;
|
|
using global::Windows.UI.Xaml.Media;
|
|
using System.Maui.Internals;
|
|
|
|
namespace System.Maui.Platform.UWP
|
|
{
|
|
public class TimePickerRenderer : ViewRenderer<TimePicker, global::Windows.UI.Xaml.Controls.TimePicker>, ITabStopOnDescendants
|
|
{
|
|
Brush _defaultBrush;
|
|
bool _fontApplied;
|
|
FontFamily _defaultFontFamily;
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing && Control != null)
|
|
{
|
|
Control.TimeChanged -= OnControlTimeChanged;
|
|
Control.Loaded -= ControlOnLoaded;
|
|
}
|
|
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
|
|
{
|
|
base.OnElementChanged(e);
|
|
|
|
if (e.NewElement != null)
|
|
{
|
|
if (Control == null)
|
|
{
|
|
var picker = new global::Windows.UI.Xaml.Controls.TimePicker();
|
|
|
|
SetNativeControl(picker);
|
|
|
|
Control.TimeChanged += OnControlTimeChanged;
|
|
Control.Loaded += ControlOnLoaded;
|
|
}
|
|
else
|
|
{
|
|
WireUpFormsVsm();
|
|
}
|
|
|
|
UpdateTime();
|
|
UpdateCharacterSpacing();
|
|
UpdateFlowDirection();
|
|
}
|
|
}
|
|
|
|
void ControlOnLoaded(object sender, RoutedEventArgs routedEventArgs)
|
|
{
|
|
WireUpFormsVsm();
|
|
|
|
// The defaults from the control template won't be available
|
|
// right away; we have to wait until after the template has been applied
|
|
_defaultBrush = Control.Foreground;
|
|
_defaultFontFamily = Control.FontFamily;
|
|
UpdateFont();
|
|
UpdateTextColor();
|
|
}
|
|
|
|
void WireUpFormsVsm()
|
|
{
|
|
if (!Element.UseFormsVsm())
|
|
{
|
|
return;
|
|
}
|
|
|
|
InterceptVisualStateManager.Hook(Control.GetFirstDescendant<StackPanel>(), Control, Element);
|
|
|
|
// We also have to intercept the VSM changes on the TimePicker's button
|
|
var button = Control.GetDescendantsByName<global::Windows.UI.Xaml.Controls.Button>("FlyoutButton").FirstOrDefault();
|
|
|
|
if (button != null)
|
|
InterceptVisualStateManager.Hook(button.GetFirstDescendant<global::Windows.UI.Xaml.Controls.Grid>(), button, Element);
|
|
}
|
|
|
|
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
{
|
|
base.OnElementPropertyChanged(sender, e);
|
|
|
|
if (e.PropertyName == TimePicker.TimeProperty.PropertyName)
|
|
UpdateTime();
|
|
else if (e.PropertyName == TimePicker.TextColorProperty.PropertyName)
|
|
UpdateTextColor();
|
|
else if (e.PropertyName == TimePicker.FontAttributesProperty.PropertyName || e.PropertyName == TimePicker.FontFamilyProperty.PropertyName || e.PropertyName == TimePicker.FontSizeProperty.PropertyName)
|
|
UpdateFont();
|
|
else if (e.PropertyName == TimePicker.CharacterSpacingProperty.PropertyName)
|
|
UpdateCharacterSpacing();
|
|
|
|
if (e.PropertyName == VisualElement.FlowDirectionProperty.PropertyName)
|
|
UpdateFlowDirection();
|
|
}
|
|
|
|
protected override bool PreventGestureBubbling { get; set; } = true;
|
|
|
|
void OnControlTimeChanged(object sender, TimePickerValueChangedEventArgs e)
|
|
{
|
|
Element.Time = e.NewTime;
|
|
((IVisualElementController)Element)?.InvalidateMeasure(InvalidationTrigger.SizeRequestChanged);
|
|
}
|
|
|
|
void UpdateFlowDirection()
|
|
{
|
|
Control.UpdateFlowDirection(Element);
|
|
}
|
|
|
|
void PickerOnForceInvalidate(object sender, EventArgs eventArgs)
|
|
{
|
|
((IVisualElementController)Element)?.InvalidateMeasure(InvalidationTrigger.SizeRequestChanged);
|
|
}
|
|
|
|
void UpdateFont()
|
|
{
|
|
if (Control == null)
|
|
return;
|
|
|
|
TimePicker timePicker = Element;
|
|
|
|
if (timePicker == null)
|
|
return;
|
|
|
|
bool timePickerIsDefault = timePicker.FontFamily == null && timePicker.FontSize == Device.GetNamedSize(NamedSize.Default, typeof(TimePicker), true) && timePicker.FontAttributes == FontAttributes.None;
|
|
|
|
if (timePickerIsDefault && !_fontApplied)
|
|
return;
|
|
|
|
if (timePickerIsDefault)
|
|
{
|
|
// ReSharper disable AccessToStaticMemberViaDerivedType
|
|
Control.ClearValue(ComboBox.FontStyleProperty);
|
|
Control.ClearValue(ComboBox.FontSizeProperty);
|
|
Control.ClearValue(ComboBox.FontFamilyProperty);
|
|
Control.ClearValue(ComboBox.FontWeightProperty);
|
|
Control.ClearValue(ComboBox.FontStretchProperty);
|
|
// ReSharper restore AccessToStaticMemberViaDerivedType
|
|
}
|
|
else
|
|
{
|
|
Control.ApplyFont(timePicker);
|
|
}
|
|
|
|
_fontApplied = true;
|
|
}
|
|
|
|
void UpdateTime()
|
|
{
|
|
Control.Time = Element.Time;
|
|
}
|
|
|
|
void UpdateCharacterSpacing()
|
|
{
|
|
Control.CharacterSpacing = Element.CharacterSpacing.ToEm();
|
|
}
|
|
|
|
void UpdateTextColor()
|
|
{
|
|
Color color = Element.TextColor;
|
|
Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush();
|
|
}
|
|
}
|
|
} |