Eto.FormsのExpanderをXAMLで

前回のExpanderについて、XAMLで書いてみます。

結果(アプリケーションの見た目や動作)は前回と似ています。

f:id:mokake:20170217230837p:plain

まずはXAMLを書いてみます。

<?xml version="1.0" encoding="UTF-8"?>
<Form
    xmlns="http://schema.picoe.ca/eto.forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="My Eto Form"
    ClientSize="250, 250"
    >
    <StackLayout>
        <Label x:Name="message" Text="Welcome!" />
        <Expander Header="detail:">
            <StackLayout>
                <TextBox x:Name="name" PlaceholderText="Your Name..." ShowBorder="True" />
                <Button Text="OK" Click="HandleOK" />
            </StackLayout>
        </Expander>
    </StackLayout>

    <Form.Menu>
        <MenuBar>
            <ButtonMenuItem Text="F&amp;ile">
            </ButtonMenuItem>
            <MenuBar.QuitItem>
                <ButtonMenuItem Text="Quit" Click="HandleQuit" />
            </MenuBar.QuitItem>
        </MenuBar>
    </Form.Menu>
</Form>

ExpanderXAML入力時にもサポートされており、intellisenseもききます。 タグの中身はControlプロパティとなります。

なお、Headerプロパティに、文字列(つまりLabel)以外のコントロールを割り当てる方法は、こちらでは未確認です。

コードビハインドから参照するコントロールには、x:Name属性を設定します。

次にC#コード(コードビハインド)を記述します。

using System;
using System.Collections.Generic;
using Eto.Forms;
using Eto.Drawing;
using Eto.Serialization.Xaml;

namespace EtoSample_ExpanderXaml
{
    public class MainForm : Form
    {
        Label message = null;
        TextBox name = null;

        public MainForm()
        {
            XamlReader.Load(this);
        }

        protected void HandleOK(object sender, EventArgs e)
        {
            message.Text = $"Welcome, {name.Text}!";
        }

        protected void HandleQuit(object sender, EventArgs e)
        {
            Application.Instance.Quit();
        }
    }
}

コードで参照するコントロールは、XAMLx:Name属性と同一の名前で定義しておく必要があります。

これで、前回と同様の(Headerだけが異なる)アプリケーションができます。

f:id:mokake:20170217230817p:plain

開くと、TextBoxとButtonがあらわれます。

f:id:mokake:20170217230837p:plain

TextBoxに名前を入れてボタンをクリックすれば、Labelの中身が書き換わります。

f:id:mokake:20170217230848p:plain

ここで一区切り

Eto.Formsについては、とりあえず今回でいったん終わろうと思います。たぶん、クライアントGUIアプリケーション開発経験者なら、あとはAPIで分かるだろうと思いますし。

クロスプラットフォームでありがちな最大公約数問題はEto.Formsでもあると思いますが、やや古風で堅実なアプリケーションをC#で作るなら、検討に値するものだと思います。