FC2ブログ

GridSplitter と Expander

Gridパネルのブロック間の高さや幅を調整するためにGridSplitterがあるのだけど、これとExpanderの相性がよろしくない。
最初
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Expander x:Name="ExpanderOne" Grid.Row="0" IsExpanded="True">
<GroupBox Background="Lavender"
/>
</Expander>
<GridSplitter Grid.Row="1" Height="5" Background="DarkGray"
HorizontalAlignment="Stretch" />
<GroupBox Grid.Row="2" Background="LightGreen"
/>
</Grid>
20200916_1.png
Expanderをたたむとこんな感じ。
20200916_2.png
むむぅ。ついてこない。まあ、あたりまえ。RowDefinitionにStyle設定する。

続きを読む
スポンサーサイト



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

ComboBoxの背景色が変わらない

ある日、同僚のTさんから相談を受けた。

同僚T:ユーザさんから、ComboBoxの背景色を変えてほしいと要望が来てですね。
俺:ほいほい。Background プロパティがあったと思うんですが。
同僚T:設定してみたんですけど、変わらないのですよ。
俺:はい?

試しに書いてみた。
<ComboBox Width="110"
Background="Red">...
表示してみる。
20200711_1.png
おや?本当だ。なぜだ?まあ、Backgroundプロパティがきちんと反映されていないんだろうか?という訳で、テンプレートを出力してみた。デザイナ上で右クリックすると出力できる。
20200711_2.png
テンプレートを覗いてみると、どうやら、

"toggleButton"というNameのToggleButtonの、
さらにそいつのテンプレート内の、"templateRoot"というNameのBorderのBackground

がComboBoxのBackgroundを変えると良さげらしい。がしかし。XAMLをよく読むと・・・
<!-- ToggleButtonのTemplate -->
<Border x:Name="templateRoot"
Background="{StaticResource ComboBox.Static.Background}"
...>
おっふ。TemplateBindingではなく、StaticResourceだと…。このKeyを上書きすれば、色は変わるかもしれないが、ComboBox全体に影響を与えてしまう。仕方ない。これはあれだ。添付プロパティ(AttachedPrperty)さんの出番だ。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

ドロップできない

仕事でちょっとてこずった話。

同僚Y:ちょっと良いアルか?
俺:良いアル。
同僚Y:つきあい良いですネ。ちょっと聞きたい事ありますヨ。

どうも、DataGridへファイルをドラグ&ドロップして処理したい、でもできないという話だった。

俺:AllowDropをTrueにすれば良いのでは?
同僚Y:やってみたけど、動かないヨ。ほら。
俺:ん?ほんとだ。

コントロール上にドロップしようと思うと、AllowDrop=Trueは必須であり、かつそれ以上できるものがない。
中々見つからなかったけど、記事がいくつかあった。
管理者として起動したVS2005でデバッグするとWM_DROPFILESが発生しない
WPFがどうのではなく、Windows7あたりからある仕様のよう。
管理者モードではなく通常モードで起動したら、普通にDrag&Dropできた。
めんどくさい・・・。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

そーいう仕様だと思うしかない

コントロールに直接プロパティに設定する値を「ローカル値」と呼んでいて、実行時に適用される値としてはかなり優先順位が高いと認識していた。ローカルに設定すると、Style内で同じプロパティに設定した値より優先されると思い込んでいた。
でも、現在開発しているプロジェクトで、「あれぇ?」というものがあったので覚書として書いておく。
<StackPanel>
<StackPanel.Resources>
<Style x:Key="EditTextStyle" TargetType="TextBox">
<Setter Property="IsReadOnly"
Value="{Binding IsText1ReadOnly, Mode=TwoWay}"/>

<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<!-- 順序が違う -->
<TextBox Name="Text1"
IsReadOnly="True"
Style="{StaticResource EditTextStyle}"

Width="200"
/>
<TextBox Name="Text2"
Style="{StaticResource EditTextStyle}"
IsReadOnly="True"

Width="200"
/>
</StackPanel>
結果はこれ
20200611_1.png
Text1は、ローカルのIsReadOnly=Trueが適用されている。
Text2は、StyleのIsReadOnly設定が適用されている。
ローカル値が常に優先されるのにと思ってた。でも、キーを指定してStyle設定したら、ローカル値と同じ優先順位になるらしい。キー指定なしのStyle設定とは違うようだ。Binidingなら何でも優先されるのか?と思ったので、StyleのIsReadOnlyプロパティをいじってみた。
<Setter Property="IsReadOnly" Value="{Binding IsText1ReadOnly, Mode=OneWay}"/>
結果はこれ
20200611_2.png
Text2にも、ローカルのIsReadOnly=Trueが適用されている。
要するに、

ローカル値よりStyle(キー指定)内の、Binding, Mode=TwoWay設定が優先される。しかも先(上)に設定したとき限定で。

ということか。
これはTextプロパティでも同じだった。何が何でもローカル値が優先されるわけではないんだなー。そーゆー仕様だと割り切りしかないかー。思い込みってこわい。
昔の記事のリンクも置いておこう。
依存関係プロパティに適用される優先順位(基本値)
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

マテリアルデザイン

隣の課から聞こえてきた「マテリアルデザイン」という単語。
調べてみれば、グーグルさん提唱のデザインだった。
Material Design
さらっと読んだだけでは、蘊蓄語れないなぁ。
ちゃんと勉強しないと。
というかこれ、仕事で使うにしても、広めるのも一苦労な気がする。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

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

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

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

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