C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WPFでGridのサイズをTriggerで変更する方法


(過去ログ 117 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68724 / inTopicNo.1)  WPFでGridのサイズをTriggerで変更する方法
  
□投稿者/ meme (1回)-(2013/11/09(Sat) 13:41:41)

分類:[.NET 全般] 

WPFで作成した画面についての質問です。
※VisualStudio2013で作成しております。

GridのWidthをTriggerで変更する方法を探しております。

ウィンドウをGridで左右に2つに分かれたものを用意し、マウスが
右側のグリッドの上に乗れば右側のグリッドの幅が延びる。
グリッドの上から外れれば幅は元に戻る。
同様にマウスが左側のグリッドの上に乗れば、左側の幅が延びる。
またマウスをグリッドから外せば元に戻る。
こういったトリガーを作りたいと考えております。


下記のソースで実験をしてみました。※1

このソースで失敗がわかったのですが、Gridに対してTriggerを設定すると
Gridのすべてに対してそのTriggerが動作してしまいます。
左右のグリッドに関係なく自動で変更されるため、マウスをグリッドの上におくと
どちらのグリッドの幅も動作してしまいます。

MultiTriggerで左のグリッドの上のとき、右のグリッドの上のとき、と細かな
条件が指定できるものなのでしょうか?
それともWPFではそこまでは記述できず、VBやC#のコードで記述しなければ
ならないのでしょうか。

お分かりの方がいらっしゃいましたらよろしくお願いいたします。


※1
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>

<Grid.Resources>
<Style TargetType="Grid">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Width" Value="200"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>

<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="100"/>
<ColumnDefinition MinWidth="100"/>
</Grid.ColumnDefinitions>

<GridSplitter VerticalAlignment="Stretch" Width="10"/>

<StackPanel Grid.Row="0" Grid.Column="0">
<TextBox Text="aaa"/>
<TextBox Text="aaa"/>
<TextBox Text="aaa"/>
<TextBox Text="aaa"/>
<TextBox Text="aaa"/>
<TextBox Text="aaa"/>
</StackPanel>

<StackPanel Grid.Row="0" Grid.Column="2">
<TextBox Text="bbb"/>
<TextBox Text="bbb"/>
<TextBox Text="bbb"/>
<TextBox Text="bbb"/>
<TextBox Text="bbb"/>
<TextBox Text="bbb"/>
</StackPanel>
</Grid>
</Window>
引用返信 編集キー/
■68726 / inTopicNo.2)  Re[1]: WPFでGridのサイズをTriggerで変更する方法
□投稿者/ Hongliang (119回)-(2013/11/09(Sat) 15:45:41)
Grid自体は単一ですから、右のグリッド・左のグリッドという表現はおかしいです。

変えたいのはGridの幅ではなく、Gridの各カラムの幅ですよね。
ですから操作対象も当然ながらColumnDefinitionのWidthということになります。
また、どこにマウスオーバーしたら幅を指定値に変更するかと考えると、
Grid全体ではどっちの幅を変えれば良いのか分からなくなりますから、
Gridの子要素として各カラムに配置されているStackPanelにマウスオーバーしたときという条件が妥当です。

トリガ発生元とスタイル適用先が違う場合、スタイルの適用先のStyleに書くのがわかりやすいです。
そうするとTriggerは使えないので、DataTriggerによるバインドで代用します。

<ColumnDefinition MinWidth=""100"">
  <ColumnDefinition.Style>
    <Style TargetType=""{x:Type ColumnDefinition}"">
      <Setter Property=""Width"" Value=""*""/>
      <Style.Triggers>
        <DataTrigger Binding=""{Binding IsMouseOver, ElementName=左のStackPanelのName}"" Value=""True"">
          <Setter Property=""Width"" Value=""400""/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ColumnDefinition.Style>
</ColumnDefinition>

もう一つのColumnDefinitionも同様に。

StackPanelなどにおいては、既定では子要素が存在する場所にマウスオーバーしたときのみ、IsMouseOverがTrueになります。
つまり下の方の空白部分ではIsMouseOverがFalse扱いです。
この動作が困るのであれば、BackgroundにTransparentを指定するなどすれば子要素にかかわらずIsMouseOverがTrueを返すようになります。

それから、今回のようにアプリケーションが幅を強制的に変更するUIの場合、
GridSplitterによってユーザが幅を変更できる仕様とは食い合わせが良くないように思います。

引用返信 編集キー/
■68740 / inTopicNo.3)  Re[2]: WPFでGridのサイズをTriggerで変更する方法
□投稿者/ meme (2回)-(2013/11/11(Mon) 09:56:12)
Hongliangさん。ありがとうございました。

無事、解決することができました。


まだWPFが一般的ではないためか、情報が少ないにもかかわらず
サンプルまで作っていただきありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -