ブログに書く内容とか

  • 仕事(開発)時の覚書的なメモ
  • メインは、C#、WPF、時々WCF
  • ご利用は自己責任でよろしく

相性の悪い組み合わせ

Gridパネルの列は、外の任意の列と幅(Width)を共有することができる。単一Gridだけでなく、他のGridとも共有可能である。
-共有したいGridを囲むコントロールに、Grid.IsSharedSizeScopeプロパティを設定する。
-ColumnDefinitionにSharedSizeGroupを設定する。
検索条件や、編集項目の位置を揃えるのに非常に便利な機能である。
ただし、便利なのだけど、非常に相性の悪い添付プロパティがいる。
それは、Grid.ColumnSpanプロパティである。
<Grid Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="CapGrp"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Grid.ColumnSpan="2" Text=""/>
</Grid>

SharedSizeGroupに同じ値が設定されたColumnDefinitionを集め、そこにあるコントロールの幅を取得して、都度幅を計算しているらしい。そこに、複数の列にまたがるColumnSpanを持ったコントロールがあると、幅の計算(Measure)と描画(Render)が暴走するようなのだ。
そう、暴走。他のコマンドすら受け付けなくなるほどに暴走する。よく落ちないものだと感心するけど、せめて警告を発してほしい。
ビルドには警告すら出ない。経験則でしかわからないので、メモっておく。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

ローカルなら動くのに

VisualStudio(VS)2005あたりから、開発用WEBサーバー(IIS Express)が提供されている。
ASP.NET Web プロジェクト用の Visual Studio の Web サーバー
これは、自分の開発用PCに、IISをインストールしなくても、WEBアプリを開発できますよー、ということも含め、お手軽な感じでWEBアプリ開発を進められるというメリットもあり、実際、開発するときに非常に重宝されている。
しかし、このお手軽さが仇となり、後々(というか、運用開始準備段階で)困ることが多々ある。一番困るのが、

開発用WEBサーバー(ローカル)なら動くのに、アプリサーバー(IIS)に移した途端、全く動かなくなる。

という奴である。デグレの定番、「昨日までは動いてた」の亜種みたいで、嫌な感じである。
よくよく考えてみれば、当然で必然の話なんだけども、最初は戸惑うのですよ、これが。IISに移動して動かなくなる箇所というのは、大体外部リソースへのアクセスエラーである。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WEB | コメント: 0 | トラックバック: 0

DataGridCellにツールチップ(Tooltip)を(弐)

DataGridCellにツールチップ(Tooltip)を(壱)の続き
DataGridCellにToolTipを表示させるため、Converterクラスを作ることにしたがが、その前に、課題にある「DataGridCellから表示内容を取得する」為に、関係するプロパティ名を取得する拡張メソッドを実装した。
/// <summary>
/// 指定のDataGridColumnに関係するパス(プロパティ名)を取得します。
/// </summary>
/// <param name="column">DataGridColumn</param>
/// <returns>DataGridColumnに関係するパス(プロパティ名)</returns>
public static string ResolveMemberPath(this DataGridColumn column) {

//DataGridTemplateColumnは、DataGridBoundColumn系ではないので、
//SortMemberPathを返します。
var path = column.SortMemberPath;

if (!string.IsNullOrEmpty(path)) {
return path;
}

//DataGridComboBoxColumn列なら、アイテムを表すDisplayMemberPathを返します。
if (column is DataGridComboBoxColumn) {
return ((DataGridComboBoxColumn)column).DisplayMemberPath;
}

//DataGridBoundColumn 系の列で、Data Bindingされているなら、
//そのBinding情報からPathを取得して返します。
var binding = (column as DataGridBoundColumn)?.Binding as Binding;

if (!string.IsNullOrEmpty(binding?.XPath)) {
return binding.XPath;

} else if (binding?.Path != null) {
return binding.Path.Path;
}

return path;
}
ん。null演算子を使うと、それなりにすっきりする。仕事ではまだつかえないけど( ノД`)。拡張メソッドにしてあるので、staticクラスに実装している。これを使って、Converterクラスを実装する。なお、このメソッドは、今回以外にも使える有能さんだったことが後で判明した。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

DataGridCellにツールチップ(Tooltip)を(壱)

WPF4でアプリ開発を始めて、少し経った頃の話。

後輩:ちょっと良いっすか。
俺:だめ。
後輩:DataGridって、列幅を狭めるとセルの中身が一部しか見えなくなるじゃないっすか。
俺:聞けよ。まあ、そうだね。
後輩:そういうときって、ツールチップ出せないっすか?
俺:ああー、ツールチップかー。まあちょっと調べようか。


列いっぱい(40~50)、文字列いっぱい(最大500文字)のデータをDataGridに表示する時、内容を参照するために逐一列を広げるのはめんどくさい。確かに欲しいよなぁと思いながら、やっぱりここだよね!とStackOverflowを調べる。

俺:これなんかどうっす?
後輩:どうっす?おお。とりあえず使ってみるっす。

しばらくして、後輩が再び来襲。

後輩:先輩、さっきの奴、ちょっと駄目っすね。
俺:ちょっと駄目っすか。
後輩:ええ。こいつ、DataGridTemplateColumnで使うと、ツールチップが出ないっすね。後、中身が空でもToolTipが出るっすよ。
俺:出てるっすね。
後輩:空の時、(ツールチップ)いらないっすよね?ええ、いらないです。というわけで、どうにかしてほしいっす。
俺:それ、「ちょっと」じゃないだろ。

しかし、調べても良い情報が出てこない。やっぱり上の記事が一番使えそうだった。仕方ないので、上の記事から発展させることにした。
課題は二点。
〇DataGridTemplateColumnでは使えない。
 DataGridTemplateColumn以外は、何とかなりそうなのに。 確かに、DataTemplateは、その気さえあれば、いくつものコントロールを組み合わせられるので、どこから値を取得して良いかはわからない。そこで、Converterを使って、ToolTipに表示する文字列を取得する事にした。手順はこんな感じ。
1.ToolTip対象のDataGridCellにバインドされるプロパティ名を取得する。
  列のソートに必要な、SortMemberPathプロパティ名が設定されていれば、それを使う。なければ、Binding情報から取得する事にしよう。
2.取得したプロパティ名から値を取得する。
 Bindingが使っている、TypeDescriptorを使って取得することにした。結局中身はReflectionかな。

〇セルの中身が空でもToolTipが出てくる。
 セルの中身が空かどうかなんて意識していないし、Visibiityプロパティに何も設定していない。
 セルに表示される内容を取得できたら、後はそれをVisibilityに変えるだけなので、上の課題をクリアできたら何とかなるか。

続く
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

C#5もぼちぼちなんだが。

What's New in C# 6
What's new in C# 7
ユーザーさんたちが使うPCの一部では、まだWindows7が現役だったりするのもあるし、一度リリースしたら、おいそれと変えられないという事情で、仕事では、.NET4 Framwwork(C#4)がメインだったりする。まあしかし、勉強しても損ではないし。使わずともどんな使い方になるかを読んでおくべきかな。
しかし、C#を1.1から勉強する新人さんたちは大変だな。教える側も内容を考えないといけないな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m