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;

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