記事一覧

Xamarin.forms で iOS用のチェックボックスを作成する。 | Xamarin.forms


Xamarin.forms で iOS 用のチェックボックスが無いので、自作してみました。
ListViewでバインドもできます。
Androidでも動作します。

ちなみにXLabsにCheckBoxのコントロールがありますが、因果関係ありすぎて、コンパイルすら通らない。。。てか多すぎ!!
他に、XuniというグレープシティのNuGetパッケージがありますが、iOSで表示されません。
さらにはグレープシティですからね。VB開発者なら誰しも1度はブラックボックスに足を取られているはず。
できれば使いたくないですよね~。多階層が表示できるとかいってSpread使いましたが、1万行になるとめちゃくちゃ遅く、入力モードにより親階層のデータが子階層にコピーされてしまう不具合もあり(公式ページに不具合情報で載りました)、最悪です。
てか有料ツールなんだから、不具合でわかりませんは会社として無いと思うんですが。。。


話は脱線しましたが、実行イメージは以下の通りです。

xamarin_ios_checkbox.png


参考サイトは以下になります。
http://stackoverflow.com/questions/30772510/how-to-add-checkbox-in-xamarin-forms-in-xaml-file


PCLにて
public class BaseCheckBox : Button
{
    public BaseCheckBox()
    {
        if (Device.OS == TargetPlatform.iOS)
            base.Image = "unchecked_bk.png";
        else
        {
            base.Image = "unchecked_wt.png";
        }
        base.Clicked += new EventHandler(OnClicked);
        base.SizeChanged += new EventHandler(OnSizeChanged);
        base.BackgroundColor = Color.Transparent;
        base.BorderWidth = 0;
    }

    private void OnSizeChanged(object sender, EventArgs e)
    {
    }

    public static BindableProperty IsCheckedProperty = BindableProperty.Create(
        propertyName: "IsChecked",
        returnType: typeof(bool),
        declaringType: typeof(BaseCheckBox),
        defaultValue: false,
        defaultBindingMode: BindingMode.TwoWay,
        propertyChanged: CheckedValueChanged);

    public bool IsChecked
    {
        get
        {
            return (bool)GetValue(IsCheckedProperty);
        }
        set
        {
            SetValue(IsCheckedProperty, value);
            OnPropertyChanged();
            RaiseCheckedChanged();
        }
    }

    private static void CheckedValueChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if ((bool)newValue == true)
        {
            if (Device.OS == TargetPlatform.iOS)
            {
                ((BaseCheckBox)bindable).Image = "checked_bk.png";
            }
            else
            {
                ((BaseCheckBox)bindable).Image = "checked_wt.png";
            }
        }
        else
        {
            if (Device.OS == TargetPlatform.iOS)
            {
                ((BaseCheckBox)bindable).Image = "unchecked_bk.png";
            }
            else
            {
                ((BaseCheckBox)bindable).Image = "unchecked_wt.png";
            }
        }
    }

    public event EventHandler CheckedChanged;
    private void RaiseCheckedChanged()
    {
        if (CheckedChanged != null)
            CheckedChanged(this, EventArgs.Empty);
    }

    private bool _IsEnabled = true;
    public virtual new bool IsEnabled
    {
        get
        {
            return _IsEnabled;
        }
        set
        {
            _IsEnabled = value;
            OnPropertyChanged();
            if (value == true)
            {
                this.Opacity = 1;
            }
            else
            {
                this.Opacity = 0.5d;
            }
            base.IsEnabled = value;
        }
    }

    public void OnEnabled_Changed()
    {

    }

    public void OnClicked(object sender, EventArgs e)
    {
        IsChecked = !IsChecked;
    }
}



表示するアイコンは以下の通りです。
PCLのResourcesフォルダに埋め込みリソースとして保存してください。

iOS用チェックあり  →f:id:junjun5555:20161001012843p:image
Android用チェックあり→f:id:junjun5555:20161001012842p:image(白色なので見えないと思います。)
iOS用チェックなし  →f:id:junjun5555:20161001012841p:image
Android用チェックなし→f:id:junjun5555:20161001012840p:image(白色なので見えないと思います。)



当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。