2009年1月26日月曜日

銘柄リストアドインを更新


一つ前のエントリの成果を受けて、銘柄リストアドインのリスト部分の見た目は完全にはっちゅう君プラスの配色に準拠しました。はっちゅう君プラスのツール-オプションメニューから配色を選択すると、それに応じてちゃんと変わります。

いつもの所のファイル置き場からどうぞ。

列の区切りに罫線が惹かれてないのが心残りだけど、これ、GridViewのスタイルかテンプレートに手を出さないといけないのかなあ。まあ深入りはしないでおこう。

ListViewを縞々にして罫線を描いて選択行の背景色を任意に設定する

ListViewを縞々にするのは色々やり方があるけれど、汎用性という意味では、ItemContainerStyleSelectorを使う方法が一番良い。罫線を引く時に、BorderThicknessを最初は1, 1, 1, 1にして残りは全て1, 0, 1, 1にするなんて事はAlternationCountなんかを使っては実現できない。

しかし、ListViewの.ItemContainerStyleSelectorを設定すると、ItemContainerStyleの設定が無視される(カスケーディングされない)し、ListViewItemをターゲットにしたデフォルトスタイルを設定していも何故かそれも無視されてシステムのデフォルトのスタイルになってしまう。このため、このエントリのタイトルに書いた事を全部実現するのは結構大変。

結局ListViewのリソースにクラシックスタイルからキー名GridViewItemContainerStyleKeyのテンプレートを丸ごとコピーしてトリガーを削除したテンプレートを書いておいて、ItemContainerStyleSelectorではそれをTemplateプロパティに割り当てた上でIsSelectedプロパティに対するトリガーも設定し、さらに縞々や罫線の設定をするという方針で解決した。

xamlは例えばこんな感じ:

<ListView Grid.Row="3" Name="StockList" ItemsSource="{Binding}" VerticalAlignment="Stretch" SelectionMode="Single" Background="#FFEDFEED">
<ListView.Resources>
<ControlTemplate TargetType="{x:Type ListViewItem}"
x:Key="ListViewItemWithoutAnyTrigger">
<Border Name="Bd"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="true">
<GridViewRowPresenter
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</ControlTemplate>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="コード" Width="Auto"
DisplayMemberBinding="{Binding Path=Code}" />
・・・ほにゃらら・・・
</GridView>
</ListView.View>
</ListView>

で、StyleSelectorはこんな感じ:

public class StockListItemStyleSelector : StyleSelector
{
public Color Back1 = Colors.White, Fore1 = Colors.Black,
Back2 = Colors.White, Fore2 = Colors.Black,
BackSelection = Colors.Red, ForeSelection = Colors.Green,
Rule = Colors.Beige;
public override Style SelectStyle(object item, DependencyObject container)
{
ListView listView = ItemsControl.ItemsControlFromItemContainer(container) as ListView;
int index = listView.ItemContainerGenerator.IndexFromContainer(container);

Style stockListItemStyle = new Style(typeof(ListViewItem));

//トリガーを除いたテンプレートに設定
stockListItemStyle.Setters.Add(new Setter(ListViewItem.TemplateProperty,
listView.Resources["ListViewItemWithoutAnyTrigger"]));

//背景色、前景色を縞々にする
stockListItemStyle.Setters
.Add(new Setter(ListViewItem.BackgroundProperty,
new SolidColorBrush(index % 2 == 0 ? Back1 : Back2)));
stockListItemStyle.Setters
.Add(new Setter(ListViewItem.ForegroundProperty,
new SolidColorBrush(index % 2 == 0 ? Fore1 : Fore2)));

//罫線を設定する
stockListItemStyle.Setters
.Add(new Setter(ListViewItem.BorderBrushProperty,
new SolidColorBrush(Rule)));
stockListItemStyle.Setters
.Add(new Setter(ListViewItem.BorderThicknessProperty,
new Thickness(index==0?1:0, 1, 1, 1)));

//選択行の色を設定する
Trigger selectionTrigger = new Trigger() {
Property = ListViewItem.IsSelectedProperty,
Value = true
};
selectionTrigger.Setters.Add(new Setter(ListViewItem.BackgroundProperty,
new SolidColorBrush(BackSelection)));
selectionTrigger.Setters.Add(new Setter(ListViewItem.ForegroundProperty,
new SolidColorBrush(ForeSelection)));
stockListItemStyle.Triggers.Add(selectionTrigger);

return stockListItemStyle;
}
}

これでstockListPanel.StockList.ItemContainerStyleSelector = new StockListItemStyleSelector() {Back1=ほにゃらら・・・};とやれば良い。

良かった良かった。

今日の戦績

その1時間で100円以上下げてやんの。ていうか、ロスタイムで7600割って終了って・・・(笑)

後場参加終了後:
Lv1.00(miniの平均発注枚数。整数部が最大発注可能枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+1616円です。

このうち手数料の支払いが384円含まれます。

買い注文回数は4回, 売り注文回数は4回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------
ロングの練習はそんなわけで損益とんとんで終了。相場は7800にトライするも元気がなく、14時くらいに7775S。再び7800にトライされてちょっとびびったけど、先週引け値まであっさり下げてきて7750C。超絶微益で後1時間くらい場は開いているけれど今日はこんなもんで良いだろう。

前場引け後:
---------------------------

---------------------------
トータル損益は-4240円です。

このうち手数料の支払いが240円含まれます。

買い注文回数は3回, 売り注文回数は2回です。

未返済の建て玉1枚の見込み損益は手数料を含まずに+500円です。


---------------------------
OK
---------------------------
今日は参加しない予定だったけど、寄りがそんなに低くなく、テクニカルな反発もしそうだったので、少しロングの練習と位置づけて参加してみた。最近、ロングの不安感とショートの安心感から合理的な行動を取れていない部分があって、環境が最悪なので偶々それが良い方に作用している感があったので。

実際に相場は微上げといった所だがそれよりもボラが大きく、揉み合いまくりで、嫌な感じに損が膨らみ続けていってしまった。先週末引けと同値の7745でショート、昼持ち越し。後場は7800付近まで戻す事ができるのか、戻ったとしてその後反転するのか、それともさらに上げるのか、という辺りが焦点になるが、そんな事分かるわけないのでとりあえず7775で指しておいた。先読みは超能力者に任せるべし。後場で高寄りしてここまでの損が帳消しになると良いな♪

ListViewの選択行の背景色

ListViewである所のstockListPanel.StockListに対して

Trigger selectionTrigger = new Trigger(){
Property = ListViewItem.IsSelectedProperty,
Value = true
};
selectionTrigger.Setters.Add(new Setter(ListViewItem.BackgroundProperty, Brushes.Chocolate));
selectionTrigger.Setters.Add(new Setter(ListViewItem.ForegroundProperty, Brushes.DarkOrange));
Style selectionStyle=new Style(typeof(ListViewItem));
selectionStyle.Triggers.Add(selectionTrigger);
stockListPanel.StockList.ItemContainerStyle = selectionStyle;

このコードで選択行の文字色は変わるけれど背景色は変わらないという事は、コントロールテンプレートと衝突しているんだろうなあ。

2009年1月25日日曜日

銘柄リストアドインは配色設定を反映するようにした


あくまで「身も蓋もない」開発がメインなので、銘柄リストアドインは見た目に凝るつもりはない。それで、はっちゅう君プラスの標準の配色設定を反映するようにした。自分が使っているモニタの特性のせいかもしれないが、はっちゅう君プラスの三つの配色設定はどれも全くもって画面が見難いと思うのだが、まあ標準に準拠する上にソースまで公開しているのだ、問題はなかろう。

ちなみに画面は上から順に標準の配色、暗い配色、明るい配色。

いつもの所のファイル置き場からどうぞ。

ところで、WPFでListViewの選択行の色を変える方法が分からなかった。IsSelectedプロパティをトリガするスタイルを作ってみたのだがうまくいかなかった。まあいいや。

株式銘柄リストのアドインは注文フォーム呼び出し機能が付きました


結局勢いで銘柄ダブルクリックによる注文フォーム呼び出し機能まで実装してしまった。いつもの所のファイル置き場からどうぞ。

株式銘柄リストのアドイン

2chのクリック証券スレッドで微妙に話題になっていた銘柄リスト機能をアドインで作ってみた。いつもの所のファイル置き場からどうぞ。

あそこの連中には嫌われているし、そもそも自分が使わない物は作らないスタンスなのだが、はっちゅう君プラスのアドイン向け機能公開が株式関係では妙に閉鎖的なのが以前から気になっていて、リフレクションを使えばもう少しアドイン開発の幅が広がるよなあと前から思っていたので、一念発起して技術的な問題が全て解決する所まではやってみた。ここより先は機械的作業になるので、まあ暇とやる気があったらという感じか。いや、暇はあるんだけどさ。その暇が自由にならないふざけた状況なのさ。

追記:
んで、注文フォームを呼び出すならどうせWPFのListViewコントロールのアイテムのダブルクリックイベントを処理しなければいけないので、それならこの削除のインタフェース(証券コードを改めて入力させる)も改めてしまおうと思って変更した。


実はこのListViewのアイテムのダブルクリックの処理というのは大変面倒で、というのも、MouseDoubleClickイベントを捕まえてSelectedItemプロパティを参照しても、空白部分がダブルクリックされて選択項目が変化しなかった場合に正しく動作しないから。で、一応ロジカルに正しい方法もあるようなのだが、大変大変面倒で、こんなのWPFの実装の問題だから将来のバージョンで改善されるのを待つべきで、ダーティーな解決法で良いや、とここに書いてあった方法を使ってみた。

改めてヒットテストを実施するとかインタフェースのコーディングとしてはものすごい低級だし、ウィンドウが静止していると仮定しているというほんの小さな問題点もあるのだが、コードとしては探した中では最もシンプル。

低級でシンプルなら高級にする必要はないわけで。でも高級にすれば必ずシンプルになるから皆高級指向になるわけで。WPFの開発チームの方、がんばってください。