スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

ポップアップは動かない(弐)

前回の続き。
親(ウィンドウ)についてこず、動かない子(ポップアップ)。
対策を調べる先は、当然StackOverflowである。
How can I move a WPF Popup when its anchor element moves?
ほほお、なるほど。という感じで、添付プロパティとして実装した。
用意する添付プロパティは、合計で三つ。

AnchorToParentWindow:Popupに添付するためのプロパティ。
FollowerPopups:フォロー中のポップアップリスト。内部用。
NowFollowing:フォロー中のWindowかどうか。内部用。

添付プロパティは、別にpublicである必要はなく、内部用としても活用できるので便利。続きを読む
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

ポップアップは動かない(壱)

現在進行中の仕事の一つで、VBで開発されたアプリをWPFに移行している。このアプリ、元がVBだけに、WPFではあまり使っていない機能を使っている。その一つがポップアップだ。しかも、表示だけではく、入力を行う画面もある。
当然、WPFにもポップアップという機能があるのだけど。このポップアップ、残念ながらそのままでは使えなかったのだ。

〇基本形
ポップアップを使うには、ポップアップとそれを表示するトリガーとなるUI(通常はボタンかな)を用意する必要がある。
ボタン
<Button x:Name="OpenPopupBtn"
Grid.Row="3"
Content="Popup表示"
Click="Button_Click_1"
HorizontalAlignment="Left" Padding="10,2" Margin="5,10"
/>

なお、VMパターンにはあるまじきイベントを利用しているけど、本稿の趣旨はそこじゃないので(言い訳)。
ポップアップ
<Popup x:Name="Popup1"
Placement="Relative" PlacementTarget="{Binding ElementName=OpenPopupBtn}"
StaysOpen="False"
VerticalOffset="-25" HorizontalOffset="10">
<Grid Background="White">
<Label>ここはポップアップの中だ</Label>
</Grid>
</Popup>
<Popup Placement="Relative" PlacementTarget="{Binding ElementName=OpenPopupBtn}">
表示位置は"相対"で、基準とするTargetはボタンであることを設定している。
StaysOpen="False"ポップアップの外でクリック等のアクションがあれば、ポップアップを閉じるようにする。
<Popup VerticalOffset="-25" HorizontalOffset="10">
ポップアップの表示位置を、PlacementTargetで指定したコントロールから垂直、水平方向にずらす。
垂直方向は、上にずらすときは、マイナス値で指定する。
<Popup StaysOpen="False">
これをFalseにしておくと、外でクリックすると消えてくれる。ただし、入力コントロールを配置するときは、逆にTrueにする必要がある。
なお、Popupの中のGridに背景色を設定しないと、透明ではなく、真っ黒になる。
ここまでは普通にできる。だが、苦労したのはここからだった。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

DataGridCheckBoxColumnの使い勝手をどうにかしたい。

DataGridの列の一つであるDataGridCheckBoxColumnは、列にCheckBoxを表示する為のコントロールであるが、その使い勝手の悪さには定評がある。
何せ、ワンクリックでON/OFFが切り替わらない。
厳密にいうと、

  • カレントセル(黒枠付き)であれば、ワンクリックで切り替わる。

  • カレントセルになった(ほかのセルから移動してきた)だけでは、切り替わらない。

である。DataGridセルの標示モードと編集モードの性質上、そうならざるをえないとわかっているが、釈然としない。
で、今進行中の案件で、CheckBoxのスタイルを適用した際、意外にもちょっとしたことで上の問題を解消できる事を発見した。
<Style TargetType="CheckBox" x:Key="CheckBoxCellStyle"/>

あるいは
<Style TargetType="CheckBox" x:Key="CellCheckBoxStyle"
BasedOn="{StaticResource {x:Type CheckBox}}"/>

と定義し、CheckBoxColumnのElementStyleに設定するだけである。
<DataGridCheckBoxColumn Binding="{Binding Selected}"
ElementStyle="{StaticResource CheckBoxCellStyle}"
/>

これでワンクリックで切り替わる。シンプルだけど、いちいち設定するのかー。DataGridColumnシリーズは、結構特殊なコントロールなので、Theme.xamlとかにStyleを設定できないんだよなぁ。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

相性の悪い組み合わせ

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

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

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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。