薄々気付かれていることとは思いますが、実は最近 WPF を始めました。
まず、最初に
WPF カスタムコントロール
を作ることから始めました。
始める場所が違うという気もしますが、まあいいでしょう。
作りたいものは RButton という Button を継承したコントロールです。
RTanakaIchiro という謎のプロパティが追加されているだけです。
Windows.Forms では Button コントロールクラスを継承した RButton クラスを作って、RTanakaIchiro プロパティを実装すればOKでした。
同じように WPF でやってみたのですが、単純に真っ白なコントロールができました。
手順は、次の通りです。
1.「新しい項目の追加」ダイアログボックスを開く
プロジェクト名で右クリック
「追加」を選択
「項目を追加」を選択
2.カスタムコントロール(WPF)ファイルを追加
画面左の「カテゴリ」から WPF を選択
画面右のテンプレートで「カスタムコントロール(WPF)を選択
ファイル名に、RButton.xaml と入力
上記によって、次のファイルとディレクトリが追加されます
RButton.cs ファイル
Themes ディレクトリー
Generic.xaml
最初に RButton.cs ファイルを次のように書き換えます。
public class RButton : Button {
// この謎の多い静的なコンストラクタは最初から記述されている
static RButton() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(RButton), new FrameworkPropertyMetadata(typeof(RButton)));
}
public string RTanakaIchiro { get; set; } // 謎のプロパティを追加
}
オリジナルのファイルを上記のように変更します。
Button クラスから派生させて、謎のプロパティを実装します。
で、以下のように TextWindow で以下のように XAML を編集します。
<Window x:Class="R.Tanaka.Ichiro.Window.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:rti="clr-namespace:R.Tanaka.Ichiro.Windows.Controls;assembly=R.Tanaka.Ichiro.Windows.Controls"
Title="TestWindow" Height="318" Width="337">
<Grid>
<rti:RButton Margin="10,74,93,78" Name="RButton">素敵だし爽やか</rti:RButton>
</Grid>
</Window>
ちなみに rti ネームスペースの assembly 部分の記述は、同一アセンブリなら不要です。
これで真っ白なボタンができます。
Windows.Forms では、見た目は同じボタンが表示されるのですが、WPF は違います。
さすが WPF です。
で、何となく先ほどの謎のコンストラクタを、以下のように変更してみました。
static RButton() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(RButton), new FrameworkPropertyMetadata(typeof(Button)));
}
最初と違うのは、FrameworkPropertyMetadata オブジェクトの生成で渡す型を RButton から Button に変更しただけです。
で、再度実行してみると、今度は Button の見た目も継承してくれていました。
ラッキー!
なんでこうなるのかとか、静的コンストラクタなのは何故なのか?とか、Themes ディレクトリー の Generic.xaml については、後でまたネタにします。
っていうか、誰かしてwww