Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Navigation] Would you like me to contribute the SelectorBarNavigator? #2468

Open
xperiandri opened this issue Jul 26, 2024 · 0 comments
Open
Labels
kind/enhancement New feature or request. triage/untriaged Indicates an issue requires triaging or verification.

Comments

@xperiandri
Copy link

What would you like to be added:

SelectorBarNavigator

Why is this needed:

To navigate using SelectorBar

For which Platform:

  • iOS
  • Android
  • WebAssembly
  • WebAssembly renders for Xamarin.Forms
  • Windows
using Uno.Extensions.Navigation.Regions;

using Windows.Foundation;

/// <summary>
/// SelectorBar control region navigator
/// </summary>
public class SelectorBarNavigator : SelectorNavigator<SelectorBar>
{
    /// <summary>
    /// Initializes a new instance of the <see cref="SelectorBarNavigator"/> class.
    /// </summary>
    public SelectorBarNavigator(
        ILogger<SelectorBarNavigator> logger,
        IDispatcher dispatcher,
        IRegion region,
        IRouteResolver resolver,
        RegionControlProvider controlProvider)
        : base(logger, dispatcher, region, resolver, controlProvider)
    {
    }

    /// <inheritdoc/>
    protected override FrameworkElement? SelectedItem
    {
        get => Control?.SelectedItem as FrameworkElement;
        set
        {
            if (Control is not null)
            {
                Control.SelectedItem = (SelectorBarItem)value!;
            }
        }
    }

    /// <inheritdoc/>
    protected override IEnumerable<FrameworkElement> Items
    {
        get
        {
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTraceMessage($"{nameof(Items)}: {Control?.Items.Count}");
            }
            return Control?.Items.OfType<FrameworkElement>() ?? Array.Empty<FrameworkElement>();
        }
    }

    /// <inheritdoc/>
    protected override Action? AttachSelectionChanged(Action<FrameworkElement, FrameworkElement?> selectionChanged)
    {
        var control = Control;
        if (control is null)
        {
            if (Logger.IsEnabled(LogLevel.Warning))
            {
                Logger.LogWarningMessage($"Unable to attach selection changed handler as Control is null");
            }
            return default;
        }

        TypedEventHandler<SelectorBar, SelectorBarSelectionChangedEventArgs> handler =
            (sb, args) =>
            {
                selectionChanged(sb, sb.SelectedItem);
            };

        control.SelectionChanged += handler;
        return () => control.SelectionChanged -= handler;
    }
}
@xperiandri xperiandri added kind/enhancement New feature or request. triage/untriaged Indicates an issue requires triaging or verification. labels Jul 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/enhancement New feature or request. triage/untriaged Indicates an issue requires triaging or verification.
Projects
None yet
Development

No branches or pull requests

1 participant