やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspbian stretch MonoDevelop Eto.Forms XAML TextBox でイベント処理してみる

 データバインドは難しそうなので一旦放置。

対象環境

前回

手順

  1. プロジェクト作成
  2. TextBox追加
  3. 実行

1. プロジェクト作成

  1. メニュー→ファイル新しいソリューション
    f:id:ytyaru:20181201194454p:plain
  2. マルチプラットフォームアプリEto Application f:id:ytyaru:20181202083840p:plain
  3. 名前などを適当に入力し、Xamlを選択する
    f:id:ytyaru:20181202083922p:plain
    f:id:ytyaru:20181202083950p:plain
  4. 場所を入力する
    f:id:ytyaru:20181201194509p:plain
  5. プロジェクトが作成される
    f:id:ytyaru:20181202084143p:plain

2. TextBox追加

  1. Xamlファイルを開く(MainForm.xeto)
  2. <TextBox x:Name="textBox1" Text="https://www.google.co.jp" Width="800" KeyDown="HandleInputUrl" />を追記する
  3. csファイルを開く(MainForm.xeto.cs)
  4. HandleInputUrlメソッドを追加する

ソースコード抜粋

MainForm.xeto

 属性=値の形式で、イベント名KeyDownとそのハンドラとする任意のメソッド名を書く。ここではハンドラ名をHandleInputUrlとする。

<?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="800, 600" Padding="10">
    <StackLayout>
        <TextBox x:Name="textBox1" Text="https://www.google.co.jp" Width="800" KeyDown="HandleInputUrl" />
    </StackLayout>
    <Form.Menu>
        <MenuBar>
            <ButtonMenuItem Text="F&amp;ile">
                <ButtonMenuItem Text="Click Me!" Click="HandleClickMe" DataContextChanged="ChangedTextBox" />
            </ButtonMenuItem>
            <MenuBar.ApplicationItems>
                <ButtonMenuItem Text="Preferences.." Shortcut="{On Control+O, Mac=Application+Comma}" />
            </MenuBar.ApplicationItems>
            <MenuBar.QuitItem>
                <ButtonMenuItem Text="Quit" Shortcut="CommonModifier+Q" Click="HandleQuit" />
            </MenuBar.QuitItem>
            <MenuBar.AboutItem>
                <ButtonMenuItem Text="About..." Click="HandleAbout" />
            </MenuBar.AboutItem>
        </MenuBar>
    </Form.Menu>
    <Form.ToolBar>
        <ToolBar>
            <ButtonToolItem Text="Click Me!" Click="HandleClickMe" />
        </ToolBar>
    </Form.ToolBar>
</Form>

MainForm.xeto.cs

 XAMLで追加したHandleInputUrlメソッドを実装する。

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

namespace HelloEtoXamlWebView
{
    public class MainForm : Form
    {
        ...
        protected void HandleInputUrl(object sender, EventArgs e)
        {
            if ((e as KeyEventArgs).Key == Keys.Enter) {
                MessageBox.Show("InputUrl: " + (sender as TextBox).Text);
            }
        }
    }
}

 引数はUI要素やイベントによって変わるので、その都度キャストせねばならない。

 いつの間にか(変数 as 型)という構文でキャストできるようになったらしい。私が知ってた記法はint a = (int)v。asのほうが高速らしい。

3. 実行

  1. Ctrl+F5で実行
  2. 怒られた
    f:id:ytyaru:20181202084218p:plain
  3. ファイルパスを辿ってexeファイルを直接叩くと実行できた
    f:id:ytyaru:20181202084343p:plain
  4. テキストボックス内でEnterキーを押す
    f:id:ytyaru:20181203132235p:plain
  5. 入力された内容がMessageBoxで表示される f:id:ytyaru:20181203132255p:plain