IObserver<T>

Reactive Extensionsは、ReactiveX(リアクティブプログラミング)を実現するためのライブラリ。

ReactiveX
GitHub - dotnet/reactive: The Reactive Extensions for .NET
Reactive Extensionsのはじめかた - かずきのBlog@hatena
C#の主要インターフェース解説:IObservable<T>、IObserver<T> - がりらぼ

このカテゴリでは本家のC#版を扱う。

WPFプロジェクトを作成し、

Button
Button

Buttonを選択。

配置
配置

このように配置。
Buttonのハンドラもダブルクリックで用意しておく。

NuGet
NuGet

NuGetから、

System.Reactive
System.Reactive

System.Reactiveで検索。

これを選択
これを選択

1番上のこれを選択してインストール。

一覧
一覧

必要なものが一通りインストールされる。

完了
完了

完了したらこうなる。

新しい項目
新しい項目

新しい項目で、

CustomObserver.cs
CustomObserver.cs

クラスCustomObserver.csを追加。

IObserver&lt;string&gt;
IObserver<string>

IObserver<string>を継承するので、

インターフェース
インターフェース

インターフェースの内部処理を実装する。

自動
自動

自動だとこうなるので、ちょっと修正して、

OnNextで渡された文字列valueをMessageBox.Showで表示する。

新しい項目
新しい項目

新しい項目で、

CustomObservable.cs
CustomObservable.cs

今度はCustomObservable.cs。

インターフェース
インターフェース

こちらもインターフェースを実装。

自動
自動

修正すると、

Subscribeでリスト追加、Executeでforeach実行。

MainWindow.xaml.csは、

customObservableにcustomObserver1、customObserver2の2つを登録。
Buttonがクリックされたら、customObservable.Executeを実行。この時、文字列"ABCDE"を渡す。

実行時
実行時

実行して、Buttonを押すと、

ABCDE(1回目)
ABCDE(1回目)

ABCDE(2回目)
ABCDE(2回目)

customObserver1、customObserver2、と2つあるので、2回表示される。

Sample/rx/IObserver_T/IObserver_T/src/IObserver_T at master · bg1bgst333/Sample · GitHub

TextBox

TextBoxは、MFCなどでいうエディットコントロールにあたるもの。

TextBox Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

WPFで、

TextBox
TextBox

TextBoxを選択。

配置
配置

このように配置。

Button
Button

Buttonを選択。

配置
配置

このように下に配置。

Buttonダブルクリックで、

ハンドラ処理を書く。
入力されたtextBox1.TextをMessageBox.Showで表示。

実行時
実行時

実行時はこう。

入力
入力

"ABCDE"を入力して、Buttonを押すと、

メッセージボックス
メッセージボックス

このように"ABCDE"が表示。

XYZ
XYZ

"XYZ"でも、

メッセージボックス
メッセージボックス

このように"XYZ"が表示される。

Sample/wpf/TextBox/TextBox/src/TextBox at master · bg1bgst333/Sample · GitHub

TextBlock

TextBlockは、MFCなどでいうスタティックテキストコントロールにあたるもの。

TextBlock Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

WPFで、

TextBlock
TextBlock

TextBlockを選択。

配置
配置

配置。

Button
Button

Buttonも追加。

配置
配置

このように下に置く。
Buttonをダブルクリックで、

ハンドラが生成されるので、textBlock1.Textに"ABCDE"をセット。

実行すると、

実行時
実行時

こうなるので、Buttonを押すと、

ABCDE
ABCDE

"ABCDE"がtextBlock1にセットされてるのがわかる。

Sample/wpf/TextBlock/TextBlock/src/TextBlock at master · bg1bgst333/Sample · GitHub

RoutedEventHandler

RoutedEventHandlerは、イベントハンドラとなるデリゲート。

RoutedEventHandler Delegate (System.Windows) | Microsoft Docs

"Routed"と名が付いているが、これはそのハンドラでイベント処理終了をしない場合、親要素がイベントを受け取り、そのイベント処理終了をするか判断し、処理終了しない場合、また親要素に渡っていくような、イベントのルーティングが行われるからである。
MFCのCCmdTargetと同じような仕組みである。

WPF アプリケーション
WPF アプリケーション

WPFで、

Button
Button

Buttonを選択し、

配置
配置

配置。

今回は手書きでハンドラを追加。
handlerで"ABCDE"表示処理を書いて、登録はWindow1のコンストラクタでやっている。

これだけだと、

実行時
実行時

実行して、押すと、

ABCDE
ABCDE

"ABCDE"が表示されるだけ。

button2
button2

このようにbutton2を内部に配置する。
button2をダブルクリックして、

今度はbutton2_Clickで"XYZ"を表示するように書く。

実行時
実行時

実行したら、

外側のButton
外側のButton

外側のButtonを押すと、

ABCDE
ABCDE

表示するのはこれだけ。
しかし、

内側のbutton2
内側のbutton2

内側のbutton2を押すと、

XYZ
XYZ

"XYZ"、そして、

ABCDE
ABCDE

"ABCDE"が表示される。
button2のイベントハンドラ処理の後に、親であるButtonのイベントハンドラ処理が実行されるのである。

Sample/wpf/RoutedEventHandler/RoutedEventHandler/src/RoutedEventHandler at master · bg1bgst333/Sample · GitHub

ButtonBase.Click

ButtonBase.Clickは、ボタンがクリックされた時に発生するイベント。

ButtonBase.Click Event (System.Windows.Controls.Primitives) | Microsoft Docs

ここにイベントハンドラを追加すると、クリックされた時に呼び出される。

WPF アプリケーション
WPF アプリケーション

WPFで、

Button
Button

Button。

配置
配置

配置して、Buttonの上でダブルクリックをすると、

button1_Clickというイベントハンドラが自動で追加される。
MessageBox.Showで"ABCDE"を表示。

XAMLの方にも、Click="button1_Click"という形で、Clickに対するイベントハンドラは"button1_Click"であることを示している。

実行時
実行時

Buttonを押すと、

ABCDE
ABCDE

このように表示される。

ButtonBase
ButtonBase

このClickはButtonBaseのClickであることが示されている。

ビルド時
ビルド時

ビルド時にはこれだけのファイルができているのだが、

Window1.g.cs
Window1.g.cs

Window1.g.csには、RoutedEventHandlerを通して、ハンドラ登録が行われてることがわかる。

Sample/wpf/ButtonBase/Click/src/ButtonBase at master · bg1bgst333/Sample · GitHub

Button

ウィンドウ上にボタンを配置する。

Button Class (System.Windows.Controls) | Microsoft Docs

WPF アプリケーション
WPF アプリケーション

今回からWPF アプリケーション。

デザインとXAML
デザインとXAML

デザインとXAMLが上下に分割した画面が出てきたら、

ツールボックス
ツールボックス

ツールボックスからButtonを選択。

Button
Button

デザイン上にButtonを貼り付ける。

XAMLはこんな感じに。

実行時
実行時

実行すると、ウィンドウ上にボタンが配置される。

押した時
押した時

押した時、色や動きは変化するが、特に何も起こらない。
イベントハンドラに処理を書いてないから当然だが。

Sample/wpf/Button/Button/src/Button at master · bg1bgst333/Sample · GitHub

Window

ウィンドウにタイトルを付けてみる。

Window Class (System.Windows) | Microsoft Docs

空のプロジェクト
空のプロジェクト

今回もあえて空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.csを追加。

WindowsBase
WindowsBase

PresentationCore
PresentationCore

PresentationFramework
PresentationFramework

System
System

この辺を追加するのは前回と一緒。

MainClass.csは、

WindowオブジェクトwindowのTitleプロパティにタイトル"Window"をセットする。
あとはapplication.Runにwindowを渡す。

実行すると、

タイトル&quot;Window&quot;
タイトル"Window"

タイトルが"Window"になってる。

Windows アプリケーション
Windows アプリケーション

コンソール アプリケーションになってるからWindows アプリケーションに。

これでOK
これでOK

これでOK。

Sample/wpf/Window/Window/src/Window at master · bg1bgst333/Sample · GitHub