竹の子エンジニア

30代から目指すエンジニアの日記

WPFのイベントの拾い方

WPFのイベントについての書きなぐりです。

<Grid>
  <Button Content="Button1" Click="Clike_Event" Width="100" Height="100"/>
<Grid>


private void Click_Event(object sender, RoutedEventArgs e)
{
  MessageBox.Show("hoge");
}

上記のように、View上にボタンを配置し、Viewのコードビハインド上にクリックされた時のメソッドを定義します。

ここで大事になってくるのは、ButtonのClickイベントそのものはデリゲートとなっており Click="Click_Event"にて、Clickイベント(デリゲート)自体にClick_Eventを定義しているということ。

なのでClickイベントが実行されると、自ずとCkick_Eventが実行されます。 ここまで、基礎的な部分の理解になります。

そして応用を聞かせて新たにデリゲートを作り、イベントハンドラーと結びつけた場合の処理

// delegate.xaml上にTextBoxを定義しており、TextBoxChangedイベントが発生されると、TextBoxChangedEventHandlerを実行するようにしています
public delegate void TextBoxInputEventHandler(object sender, TextChangedEventArgs e);  // 型の定義
public event TextBoxInputEventHandler TextBoxInput;  // デリゲートの定義

private void TextChangedEventHandler(object sender, TextChangedEventArgs e) 
// TextBoxChangedイベントが発生されると、ここが実行される
{
  if (this.TextBoxInput != null)
  {
    // デリゲートを呼ぶ。以下の処理で定義されたメソッドが実行される
    this.TextBoxInput(this, e);
  }
}

実際の処理するView側でデリゲートに対してメソッドを定義する

this.delegate.TextBoxInput += showMessageBox_hoge;

// 実行するメソッド
private void showMessageBox_hoge(object sender, TextChangedEventArgs e)
{
  MessageBox.Show("hoge")
}

VisualStudioでvimキーバインディングを使うわがままをお許しください。

どうもこんにちは。

最近会社でC#でコードを書いており、VisualStudioを使っているんですが、どうしてもvimが使いたかったのでvsvimを使ってます。
拡張に関しては基本的に行わないようにしているので、vsvimrcを触ったりなんかはしてないです。
(そもそもvimrcをどこに記述するのかをよくわかっていない)

今回VisualStudioでVsVimを使うにあたってのコマンドの覚え書きと言いたいところですが、VsVimに関わらず基本的なvimコマンドの自分用の備忘録です。

文字入力系

i : カーソル行から文字を挿入する
I : カーソル行の先頭行から文字を挿入する
a : カーソル行の右から文字を挿入する
A : カーソル行の末尾から文字を挿入する
o : カーソル行の下から文字を挿入する(改行される)
O : カーソル行の上から文字を挿入する(改行される)

ビジュアルモード(矩形選択)系

Ctrl + v : ビジュアルモードへの移行
Ctrl + v + 行選択 + I + (文字挿入) + Esc : ビジュアルモードの選択行の先頭に文字を追加
(例)

aaa
bbb
ccc

上記の文章があるとして、Ctrl+v→3行選択→Iを押下し、[//]と記入後Escを押す

//aaa
//bbb
//ccc

となる

Ctrl + V : 行をすべて選択

文字削除系

文字を削除するともれなくヤンクされる
x : 一文字削除
dw : カーソル位置から単語分削除
d$ : カーソル位置から行末まで削除

di(対象文字) : 対象文字までの中身だけ削除
(例)

(hogehoge(fugafuga))

となっている場合、hogeのどこかにカーソルがある状態で、di)とすると、
()となる。
同様に、fugaのどこかにカーソルがある状態でdi)とすると、(hogehoge())となる。

画面スクロール系

Ctrl + e : 画面を一行分下にスクロールする(カーソルは移動しない)
Ctrl + d : 画面を1ページ分下にスクロールする(カーソルも移動する)

ヤンクせずに削除する方法
"_ + (削除系コマンド)

コピーしたのに削除してしまったためヤンクされた場合の対処
"0p : 直前のヤンクしたテキストをペースト

タブ系

gt : 次のタブに移動

vs
垂直画面分割
split
平行画面分割
close
タブを閉じる

検索

/を押して検索を行う
/(検索文字) : 文字を前方検索 n で次へ
?(検索文字) : 文字を後方検索 n で次へ
Ctrl + R →" でヤンクしたテキストのペースト

置換系

→ s/hogehoge/hugahuga/
hogehogeを一括してhugahugaに置換

VisualModeで:を押すと、:'<,'>となるが、同様に上記と同じコマンドを入力すると置換可能(選択範囲の該当する内容だけが置換対象となる)

VisualStudioならではのコマンド

コードの展開、表示 : Ctrl + M → Ctrl + M: コードの展開・折りたたみ
Ctrl + M → Ctrl + L : すべてのコードの展開・折りたたみ

ソリューションエクスプローラーにフォーカス: Ctrl + Alt + L

余談(1)

たまに先輩にこういう風にコード書き換えたらできるよ!って感じでキーボードを奪われる時があるんですが、英語キーボードvimキーバインディング+VisualStudioのショートカットほぼ使えないという状況にしているのでたまにすんませんとなったりはします。
セキュリティは完璧だね!

あと英字キーボードを使う上で便利なのが、Altキー空打ちで日本語入力を切り替えるツールを使っています。
こちらについては以下のリンクを参照ください。
www.karakaram.com

ただVisualStudio(2013だけ?)だとAltキー空打ちしても日本語入力切り替わったり切り替わらなかったりするプロジェクトがあるのはなんでなんだろ…。
そういう時は仕方なくAlt + ~使ってますが、VisualStudioだけでこれ使うのもめんどくさい……。

あと日本語入力に関してもESCキーを押したときに解除されると捗ります。

余談(2)

誰かこれを買ってVimについて教えてください…。(金欠すぎて買えない)

地味に悔しかったりはしている

仕事でプログラミングを触る機会があるものの、なかなか身にならずに常に悔しい感じを出しています。
とはいえ、そこに情熱を傾けることができない自分にもイライラしているのもあり。

理想を掲げて飛び込んだはずなのになかなか難しい。

という感じのポエムです、こんにちは。

未経験者でプログラマーになったという人をよく見かけますが、
実際のところその後はどうなんでしょう。

自分もプログラミングについてはほぼ未経験で飛び込んだ身ですが、
コードリーディングですぐにつまづいてしまい挫折を繰り返している最近。。。
なんでこう難しい実装なんだろうなと思わざるをえない(´-`)

あと勉強法については以下が個人的に刺さりました。

tokyofreelance.jp

本当に勉強法については毎々見直しが必要……。
学生時代の癖が抜けず、100覚えるまで進めないという情報は打破しないといけない。

デリゲートの理解のために(2)

前回、デリゲートの概要について触れました。 takecho.hatenablog.com

今回もうちょっと中身に踏み込んで、デリゲートの用途について書いていきます。 あくまで自分用に噛み砕いた内容になるので、詳しくは下記サイト様をご参照ください。 すごくわかりやすいです。

ufcpp.net

ちなみに私の開発環境ではC#のバージョンは4.0なので、それに沿って記述していきます。

またデリゲートについて登場する自分人物として、 匿名メソッド、ラムダ式などが登場します。

デリゲートの用途

デリゲートの用途として述語というものがあります。

述語

「オブジェクトが○○である」という条件を満たすかどうかを調べるメソッドを述語と呼びます。 デリゲートを使用することで以下のように記述することができる。

static void Main()
{

    int[] x = new int[] { 1, 8, 4, 11, 8, 15, 12, 19 };

    // xの中から値が10以上のものだけ取り出す
    int[] y = Select(x, new Predicate(IsOver10));
    foreach(int i in y)
        Console.Write("{0}", i);
    Console.Write("\n");

    // xの中から値が(5,15)の範囲にあるものだけ取り出す
    int [] z = Select(x, new Predicate(Is5to15));
    foreach(int i in z)
        Console.Write("{0}", i);
    Console.Write("\n");
}

static bool IsOver10(int n)
{
    return n > 10;
}

static bool Is5to15(int n)
{
    return ( n > 5 ) && ( n < 15 ); 
}

// デリゲートの定義
// 戻り値:bool, 引数:int型
delegate bool Predicate(int n);

public static int[] Select(int[] x, Predicate pred)
{
    int n = 0;
    foreach (int i in x)
    {
        if (pred(i))
        {
            ++n;
        }
    }

    int[] y = new int[n];

    n = 0;
    foreach(int i in x)
    {
        if (pred(i))
        {
            y[n] = i;
            ++n;
        }
    }
    return y;
    }
}

上記を定義するとSelectメソッドを呼び出すときに、メソッドを渡してあげることで委譲することができる。といったニュアンスになるんだろうか。 メソッドを渡すことで振る舞いを変えられるというのは確かに便利かもしれない。(頭の中が混乱するけど。。。)

匿名関数

デリゲートを理解する上で、さらに必要となる内容として、匿名関数というものがある。 詳細に関しては参考サイト様をご参照ください。(委譲)

匿名メソッドは以下のように書くことができる。

delegate bool Predicate(int n);
int[] x = new int[] { 1, 8, 4, 11, 8, 15, 12, 19 }
int[] y = Select(x, delegate(int n) { return n > 10; } );

public static int[] Select(int[] x, Predicate pred)
{
    int n = 0;
    foreach (int i in x)
    {
        if (pred(i))
        {
            ++n;
        }
    }

    int[] y = new int[n];

    n = 0;
    foreach(int i in x)
    {
        if (pred(i))
        {
            y[n] = i;
            ++n;
        }
    }
    return y;
    }

上記で、new Predicate(IsOver10)と書いていた部分にdelegate(int n) { return n > 10; }と、IsOver10の中身そのままを書くことができる。 匿名メソッドとは、このようなdelegateキーワードからはじめて、メソッドの中身を埋め込んだ部分のことを指す。

delegate (引数リスト) { メソッド定義 }

ラムダ式

ラムダ式というのも(私が)よくわからない一因のそれです。 ラムダ式MSDNによると、デリゲート、またはデリゲートにコンパイルされる式ツリーとして表現できるコード。 値を返さないラムダ式は、そのパラメーター数に応じて、特定のActionデリゲートに対応します。 値を返すラムダ式は、そのパラメーター数に応じて特定のFuncデリゲートに対応します。 例えば、二つのパラメータがあっても値を返さないラムダ式は、Action<T1,T2>デリゲートに対応します。 パラメータが一つあり、値を返すラムダ式はFunc<T,TResult>デリゲートに対応します。とのこと。

ここで、FuncとActionという内容が出てきました。 値を返すのがFunc、値を返さないのがAction。

上記でも書いた以下の記法を変更できるようになるといったもの。

delegate(int n) { return n > 10; } 
(int n) => { return n > 10; }

変数の方が左辺値や関数の引数から推論できる場合、以下のようにも書けます。

Func<int, bool> f = n => { return n > 10; };

上記のような記法をラムダ式と呼びます。

とりあえず、今回はここまで。

デリゲートの理解のために(1)

C#のデリゲートがわからない。 そんな自分のための書きなぐった日記。

以下のサイト様を参考にさせていただきましたが、非常にわかりやすくて勉強になりました。 C#の初学者の方には以下のサイト様にいくことをおすすめします。

ufcpp.net

また、下記は私がわかりやすいように噛み砕いた内容ですので、 ご容赦ください。

デリゲートとは?

デリゲートとはメソッドを参照するための型です。 以下のように記述します。

delegate 戻り値の型 デリゲート型名(引数リスト);

<例文>

delegate void SampleDelegate(int a);

// クラス定義
class Sample
{
  // デリゲート型の変数にメソッドを格納
  SampleDelegate hensu = new SampleDelegate(ShowMessage);
  
  hensu("デリゲートがわからない!");
}

// メソッド
static void ShowMessage(string mes)
{
  Console.Write("{0}\n", mes);
}

(出力結果)

デリゲートがわからない!

上記でデリゲート型変数(hensu)にメソッド(ShowMessage)を格納し、 変数に引数を渡すと、メソッドが呼ばれます。

マルチキャストデリゲート

デリゲートは+=を使うことで、複数のメソッドを代入することができる。 複数のメソッドを代入した状態で、デリゲートを呼び出しを行うと、代入したすべてのメソッドが呼び出される。 このことをマルチキャストデリゲートと呼ぶ。ただし、マルチキャストデリゲートが使えるのは、戻り値がvoid(戻り値なし)の場合のみ。

delegate void SampleDelegate();

class SampleDelegate
{
  static void Main()
  {
    SampleDelegate hensu = new SampleDelegate(ShowMessageA)
    hensu += new SampleDelegate(ShowMessageB)
    hensu += new SampleDelegate(ShowMessageC)
    
    hensu()
  }

  static void ShowMessageA() { Console.Write("デリゲートがわからないやつA\n"); }
  static void ShowMessageB() { Console.Write("デリゲートがわからないやつB\n"); }
  static void ShowMessageC() { Console.Write("があらわれた\n"); }

(出力結果)

デリゲートがわからないやつA
デリゲートがわからないやつB
があらわれた

マルチキャストデリゲートは、代入した順番で実行されます。

ここまでは単純でわかりやすい。 とはいえ、メソッドを参照する型を用意しただけで、利用価値が曖昧である。

続きます。

C#がわからない(WPF)

ちょっと今月Kotlinを勉強しようとしていたんですが、
先にC#を勉強します。

C#WPF使って、MVVMで構築するっていう話があるんですが、
ICommandを継承したデリゲートを実装して云々かんぬんと言われ、
デリゲートって何それおいしいの?状態なのでさすがに危機感を覚えました。

できれば中旬までに理解したい…。

藁にも縋る

つくづく勉強していて思うのは自分の記憶力のなさについて。
何度も読み返してるのに、数秒経つと忘れている。。

勉強方法の改善の必要があるのと、
藁にも縋る思いでDHAサプリを購入してみました。

届くのがおそらく今週中なので、ひとまず一か月続けてみたいと思います。
頭がよくなりたい。。。

余談

個人的にスクエアエニックスから発売された、ニーアレプリカント
陰鬱として救われない感じの物語が大好きなんですが、
オーケストラアレンジのサウンドトラックを買いました。
勉強中に聞いていますが、とてもナーバスな気分になれるのがとても良いです。