private EventHandler<StateChangedEventArgs> stateChangeHandler;
private bool isPressed = false;
- internal int styleApplying = 0;
+ internal bool styleApplying = false;
/// <summary>
/// Gets accessibility name.
[EditorBrowsable(EditorBrowsableState.Never)]
protected void UpdateState()
{
- if (styleApplying > 0) return;
+ if (styleApplying) return;
ControlState sourceState = ControlState;
ControlState targetState;
if (type == DisposeTypes.Explicit)
{
- Extension?.OnDispose(this);
+ if (Extension != null)
+ {
+ Extension.OnDispose(this);
+ Extension = null;
+ }
if (buttonIcon != null)
{
Utility.Dispose(buttonIcon);
+ buttonIcon = null;
}
if (buttonText != null)
{
Utility.Dispose(buttonText);
+ buttonText = null;
}
if (overlayImage != null)
{
Utility.Dispose(overlayImage);
+ overlayImage = null;
}
}
Size2D cellPadding = String.IsNullOrEmpty(buttonText.Text) ? new Size2D(0, 0) : itemSpacing;
#pragma warning restore CA2000
+ var linearLayout = Layout as LinearLayout;
+ if (linearLayout == null) Layout = (linearLayout = new LinearLayout());
+
if (IconRelativeOrientation == IconOrientation.Left)
{
- Layout = new LinearLayout()
- {
- LinearOrientation = LinearLayout.Orientation.Horizontal,
- HorizontalAlignment = itemHorizontalAlignment,
- VerticalAlignment = itemVerticalAlignment,
- CellPadding = cellPadding
- };
+ linearLayout.LinearOrientation = LinearLayout.Orientation.Horizontal;
+ linearLayout.HorizontalAlignment = itemHorizontalAlignment;
+ linearLayout.VerticalAlignment = itemVerticalAlignment;
+ linearLayout.CellPadding = cellPadding;
Add(buttonIcon);
Add(buttonText);
}
else if (IconRelativeOrientation == IconOrientation.Right)
{
- Layout = new LinearLayout()
- {
- LinearOrientation = LinearLayout.Orientation.Horizontal,
- HorizontalAlignment = itemHorizontalAlignment,
- VerticalAlignment = itemVerticalAlignment,
- CellPadding = cellPadding
- };
+ linearLayout.LinearOrientation = LinearLayout.Orientation.Horizontal;
+ linearLayout.HorizontalAlignment = itemHorizontalAlignment;
+ linearLayout.VerticalAlignment = itemVerticalAlignment;
+ linearLayout.CellPadding = cellPadding;
Add(buttonText);
Add(buttonIcon);
}
else if (IconRelativeOrientation == IconOrientation.Top)
{
- Layout = new LinearLayout()
- {
- LinearOrientation = LinearLayout.Orientation.Vertical,
- HorizontalAlignment = itemHorizontalAlignment,
- VerticalAlignment = itemVerticalAlignment,
- CellPadding = cellPadding
- };
+ linearLayout.LinearOrientation = LinearLayout.Orientation.Vertical;
+ linearLayout.HorizontalAlignment = itemHorizontalAlignment;
+ linearLayout.VerticalAlignment = itemVerticalAlignment;
+ linearLayout.CellPadding = cellPadding;
Add(buttonIcon);
Add(buttonText);
}
else if (IconRelativeOrientation == IconOrientation.Bottom)
{
- Layout = new LinearLayout()
- {
- LinearOrientation = LinearLayout.Orientation.Vertical,
- HorizontalAlignment = itemHorizontalAlignment,
- VerticalAlignment = itemVerticalAlignment,
- CellPadding = cellPadding
- };
+ linearLayout.LinearOrientation = LinearLayout.Orientation.Vertical;
+ linearLayout.HorizontalAlignment = itemHorizontalAlignment;
+ linearLayout.VerticalAlignment = itemVerticalAlignment;
+ linearLayout.CellPadding = cellPadding;
Add(buttonText);
Add(buttonIcon);
}
}
- /// <inheritdoc/>
+ /// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
- public override ImageView OnCreateTrack(Switch switchButton, ImageView track)
- {
- base.OnCreateTrack(switchButton, track);
- track.Relayout += (s, e) => {
- if (slidingAnimation.State == Animation.States.Playing) return;
- switchButton.Thumb.PositionX = switchButton.IsSelected ? switchButton.Track.Size.Width - switchButton.Thumb.Size.Width : 0;
- };
- return track;
- }
-
- /// <inheritdoc/>
- public override ImageView OnCreateThumb(Switch switchButton, ImageView thumb)
+ public override void OnTrackOrThumbResized(Switch switchButton, ImageView track, ImageView thumb)
{
- base.OnCreateThumb(switchButton, thumb);
- thumb.Relayout += (s, e) => {
- if (slidingAnimation.State == Animation.States.Playing) return;
- thumb.PositionX = switchButton.IsSelected ? switchButton.Track.Size.Width - thumb.Size.Width : 0;
- };
- return thumb;
+ var destX = switchButton.IsSelected ? switchButton.Track.Size.Width - thumb.Size.Width : 0;
+ if (destX != thumb.PositionX) thumb.PositionX = destX;
}
[EditorBrowsable(EditorBrowsableState.Never)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override void ApplyStyle(ViewStyle viewStyle)
{
- styleApplying++;
+ styleApplying = true;
base.ApplyStyle(viewStyle);
if (viewStyle is SwitchStyle switchStyle)
{
- if (Extension is SwitchExtension extension)
+ if (Extension != null) Extension.OnDispose(this);
+
+ if ((Extension = switchStyle.CreateExtension()) != null && Extension is SwitchExtension extension)
{
Icon.Unparent();
thumb.Unparent();
+ TextLabel.Unparent();
Icon = extension.OnCreateTrack(this, Icon);
thumb = extension.OnCreateThumb(this, thumb);
Icon.Add(thumb);
LayoutItems();
+
+ Icon.Relayout -= OnTrackOrThumbRelayout;
+ Icon.Relayout += OnTrackOrThumbRelayout;
+
+ thumb.Relayout -= OnTrackOrThumbRelayout;
+ thumb.Relayout += OnTrackOrThumbRelayout;
}
if (switchStyle.Track != null)
{
Thumb.ApplyStyle(switchStyle.Thumb);
}
+
+ if (switchStyle.Text != null)
+ {
+ TextLabel.ThemeChangeSensitive = false;
+ TextLabel.ApplyStyle(switchStyle.Text);
+ }
}
- styleApplying--;
+ styleApplying = false;
UpdateState();
}
+ private void OnTrackOrThumbRelayout(object sender, EventArgs args)
+ {
+ if (Extension is SwitchExtension switchExtension)
+ {
+ switchExtension.OnTrackOrThumbResized(this, Icon, thumb);
+ }
+ }
+
/// <summary>
/// Switch's track part.
/// </summary>
if (type == DisposeTypes.Explicit)
{
- Utility.Dispose(thumb);
+ if (Icon != null)
+ {
+ Icon.Relayout -= OnTrackOrThumbRelayout;
+ }
+ if (thumb != null)
+ {
+ thumb.Relayout -= OnTrackOrThumbRelayout;
+ Utility.Dispose(thumb);
+ }
}
base.Dispose(type);