newの再定義とboostのインクルード

boostのライブラリをインクルードする時、
newを再定義していたりすると*1コンパイルで落ちることがある。

上手くinclude順を調整すれば回避できるようだが、
一筋縄でいかない事もあるので注意。

*1:メモリリークの検知などで行番号を埋め込むときとか

勝手に動かないで

WPFのデザインモードかどうかをチェックする方法。
デザインモードではカレントディレクトリなど、色々実行時と異なる要素がある
ので、それで例外投げて落ちられると、デザイナが機能しなくなる。

DesignerProperties.GetIsInDesignMode(this)
//thisはUIエレメント。返り値はbool値。

デザインモードの場合は、サンプル的なデータを食わせて、
キレイに初期化しておくのが吉。

しかし例外投げたら、最低限のUIレイアウトだけ表示するとか、
もう少し気の利いた造りには出来なかったんですかね。。。
デザイナに振り回されるコードを書くのは正直気が進みませんなあ。

WPFでのUIアンチエイリアス封じ込め

WPFでのアンチエイリアス封じ込めのために。
Root要素で以下の指定をしておけば大体全部?アンチエイリアスを無効にできる。

RenderOptions.BitmapScalingMode="NearestNeighbor"
RenderOptions.EdgeMode="Aliased"

http://blogs.msdn.com/b/hiroyuk/archive/2009/02/16/9425120.aspx
参考。

UseLayoutRoundingプロパティやSnapsToDevicePixelsプロパティも試してみた
が、今ひとつ動作に信用が置けなかったので、他の方法を探していた所発見した
次第。
マップエディタとか、2Dピクセル系のものを作る時に、
アンチエイリアスは邪魔なだけなので、この方が確実。

画像つき背景とか

ちょっと凝った背景*1をコントロールの背景に設定し
たい時、Templateを使えば上手くいくかと思ったら中々行かなかった。

仕方ないので何もしないGridのみのUserControlを使って代用。
これで背景などのスタイルも一元管理できるけど、
いささか大掛かりすぎる気がする。

その内もっと良い手が見つかるかもしれないが、とりあえずこれで。

*1:画像背景+透過PNGなど

最近の開発事情

最近はWPFを久々にゴリゴリ書きつつ、
リソース管理用のツールを大々的に作ってる状態。

「モノクロ」時代からの反省を生かしつつ、
今度はできる限りデータ抽象をきっちり作って、
コンテンツは全部ツールの方で弄ろうという魂胆。。。

ついでにエフェクトエディタとかイベントスクリプト用のエディタとか、
色々作ってしまおうという狙いもあるけども。
MarbleTownsに限らず、今後色々使えそうだし。

ということで少し先のことも考えつつ、
UI要素とか、細かい部分からじっくり作ってる状況。
その「先」がどの程度あるのかってのは、
あまりアテにならない読みに基づくので信用できませんがね!
しかし本当に時間食いな趣味だよ。

UserControlの継承めも

自前のUserControlを継承して、
派生のUserControlを作りたい時に。
基底クラスのコードをoverrideして独自処理にしたりとか。

基本的なやり方は、
http://d.hatena.ne.jp/kent013/20091129/1259482727
http://d.hatena.ne.jp/okazuki/20091025/1256472760
http://csfun.blog49.fc2.com/blog-entry-42.html
この辺りのページが参考になる。

基本的には、新しくUserControlを追加して、
XAML側のルート要素を

<local:MyUserControl
    x:Class="ProjectName.FolderName.ClassName"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:MyNameSpace"
    mc:Ignorable="d"
    >
</local:MyUserControl>

みたいな感じで、local:MyUserControlに変更。
その上で、xaml.csファイルのクラス定義で、基底クラスを
自分で作ったUserControlのクラスに置き換える。

ただしこのままコンパイルしても怒られる*1
なので、xamlファイルのプロパティにある、
「ビルドアクション」を"Page"から"Resource"に変更する。
これでg.csファイルが自動生成されなくなる様子。
自分の環境の場合、これでコンパイルが通った。
今のところ弊害は出ていない模様。

http://csfun.blog49.fc2.com/blog-entry-42.html
にあるような、InitializeComponent()の修正はしていない。*2

(このあと問題が起きなければ)これでUserControlの派生、量産が大分やりや
すくなる。
これとWPFのTemplate機能を組み合わせれば、更に柔軟性・拡張性が上がる気が
する*3
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_02.html
Templateの中にイベントハンドラを埋め込む方法については、
http://pro.art55.jp/?eid=1046821
この辺が参考になりそう。後で試してみる。上手く行ったら後で纏める。

*1:自動生成のpartialクラス(g.csファイル)の方で齟齬が発生するらしい。

*2:こちらの環境が VS2010で、元記事から大分時間が立っているから?

*3:生コントロールにUIを付け加える場合とか