xamarin - 如何将 iOS 中 Selector Rendere 的颜色更改为新颜色?

标签 xamarin xamarin.forms

我正在使用创建一个看起来像这样的选择器的代码:

<local:CustomSwitch

我想要做的是更改代码,以便将蓝色全部更改为 XAML 中指定的颜色。有没有人对如何做到这一点有任何想法?

我使用的 XAML 如下所示:

<local:SegmentedControl ValueChanged="OnModeChanged" x:Name="segControlMode" HorizontalOptions="End">
   <local:SegmentedControl.Children>
      <local:SegmentedControlOption Text="Learn" />
      <local:SegmentedControlOption Text="Quiz" />
   </local:SegmentedControl.Children>
</local:SegmentedControl>

iOS渲染器:

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Diagnostics;
using System;

[assembly: ExportRenderer(typeof(Japanese.SegmentedControl), typeof(Japanese.iOS.SegmentedControlRenderer))]
namespace Japanese.iOS
{
    public class SegmentedControlRenderer : ViewRenderer<SegmentedControl, UISegmentedControl>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<SegmentedControl> e)
        {
            base.OnElementChanged(e);

            UISegmentedControl segmentedControl = null;
            if (Control == null)
            {
                segmentedControl = new UISegmentedControl();

                for (var i = 0; i < e.NewElement.Children.Count; i++)
                {
                    segmentedControl.InsertSegment(Element.Children[i].Text, i, false);
                }

                SetNativeControl(segmentedControl);
                SetSelectedSegment();
            }

            if (e.OldElement != null)
            {
                // Unsubscribe from event handlers and cleanup any resources
                if (segmentedControl != null)
                    segmentedControl.ValueChanged -= NativeValueChanged;
            }

            if (e.NewElement != null)
            {
                // Configure the control and subscribe to event handlers
                segmentedControl.ValueChanged += NativeValueChanged;
            }
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == nameof(SegmentedControl.SelectedSegment))
                SetSelectedSegment();
        }

        void NativeValueChanged(object sender, EventArgs e)
        {
            if (Element is SegmentedControl formsElement)
            {
                formsElement.SelectedSegment = (int)Control.SelectedSegment;
            };
        }

        void SetSelectedSegment()
        {
            if (Element is SegmentedControl formsElement)
            {
                if (formsElement.SelectedSegment >= 0 && formsElement.SelectedSegment < Control.NumberOfSegments)
                    Control.SelectedSegment = formsElement.SelectedSegment;
            }
        }
    }
}

我想做的是在 XAML 中更改类似这样的颜色,例如:

<local:SegmentedControl ValueChanged="OnModeChanged" x:Name="segControlMode" HorizontalOptions="End" Color="Red" >
    <local:SegmentedControl.Children>
      <local:SegmentedControlOption Text="Learn" />
      <local:SegmentedControlOption Text="Quiz" />
   </local:SegmentedControl.Children>
</local:SegmentedControl>

最佳答案

您可以创建一个 BindableProperty在共享项目类上并在渲染器上处理其更改。

以下是您必须做的一些更改:

创建一个 BindablePropertySegmentedControl类(class)

public class SegmentedControl : Xamarin.Forms.View /* Replace this with your real inheritance */
{
    /* ... The rest of your class ... */

    public static readonly BindableProperty TintColorProperty = BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(SegmentedControl), Color.Blue, BindingMode.OneWay);
    public Color TintColor
    {
        get { return (Color)GetValue(TintColorProperty); }
        set { SetValue(TintColorProperty, value); }
    }

    /* ... The rest of your class ... */
}

然后将所选颜色传输到渲染器方法上的 native 控件等效属性 :

protected override void OnElementChanged(ElementChangedEventArgs<SegmentedControl> e)
{
    base.OnElementChanged(e);

    /* ... Your previous code as it is now ...*/

    segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();

    SetNativeControl(segmentedControl);
    SetSelectedSegment();

    /* ... Your further code as it is now ...*/
}

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    if (e.PropertyName == nameof(SegmentedControl.SelectedSegment))
        SetSelectedSegment();

    /* Keep one eye on changes after rendered */
    if(e.PropertyName == SegmentedControl.TintColorProperty.PropertyName)
        SetSegmentTintColor();
}

void SetSegmentTintColor()
{
    if (Element is SegmentedControl formsElement)
        Control.TintColor = formsElement.TintColor;
}

关于xamarin - 如何将 iOS 中 Selector Rendere 的颜色更改为新颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48537908/

相关文章:

ios - 无法验证...的代码签名无法在我的 iPhone 上安装应用程序

android - ReloadState 方法和 MvxViewModel 上的 Init 不冲突吗?

ios - 从 TimerCallback 实例调用时,调用 Dropbox API Client.Files.DownloadAsync 不会返回元数据

c# - Android 警报管理器未在指定时间触发

c# - Xamarin Forms PCL with Caliburn,只有创建 View 层次结构的原始线程才能触及其 View

c# - 发现 LAN 上的所有设备

c# - Xamarin.iOS Firebase 未接收推送通知但接收 token

c# - Xamarin IOS 基于自定义渲染器中的 IsFocused 属性隐藏搜索栏图标

ios - Xamarin 表格 : jamesmontemagno/MediaPlugin: Selected picture is rotating when added to UI in IOS app

ios - "A valid provisioning profile for this executable was not found"用于 Xamarin.Forms iOS RELEASE 构建到 iPhone 设备