まずタイトルの件は、そういう仕様ということになります。
Dependency Property Value Precedence - WPF .NET Framework | Microsoft Docs
追記いただいた図から再現しようとしたんですが、ToggleButton3
はトグルしておらずどういう処理なのかわかりませんでした。
仕方がないのでトグルボタン2個パターンで同じ動きの組、都合4つ使って図に合わせてみました(2個でもできますが、位置の移動等が煩雑になるので^^;
雑に作ってみたところ、Trigger
でIsChecked
を変えるような状況にならず、問題を再現できませんでした(xamlがないとこれ以上検討できそうにないです^^;
このままでは使い物にならないでしょうが、何かのヒントになれば幸いです。
xml
1 < Window
2 x: Class = " Questions300473.MainWindow "
3 xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
4 xmlns: x = " http://schemas.microsoft.com/winfx/2006/xaml "
5 Width = " 450 "
6 Height = " 450 "
7 Closing = " Window_Closing "
8 Loaded = " Window_Loaded " >
9 < Window.Resources >
10
11 < Style x: Key = " ExpanderStyle1 " TargetType = " {x:Type Expander} " >
12 < Setter Property = " ClipToBounds " Value = " True " />
13 < Setter Property = " Template " >
14 < Setter.Value >
15 < ControlTemplate TargetType = " {x:Type Expander} " >
16 < Border >
17 < DockPanel >
18 < Grid x: Name = " HeaderSite " DockPanel.Dock = " Top " >
19 < ToggleButton
20 x: Name = " Close2Small "
21 HorizontalAlignment = " Right "
22 VerticalAlignment = " Top "
23 Content = " < "
24 IsChecked = " {Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}} "
25 ToolTip = " Close→Small " />
26 < ToggleButton
27 x: Name = " Small2Close "
28 HorizontalAlignment = " Left "
29 Content = " > "
30 IsChecked = " {Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}} "
31 ToolTip = " Small→Close "
32 Visibility = " Hidden " />
33
34 < ToggleButton
35 x: Name = " Small2Large "
36 HorizontalAlignment = " Right "
37 Content = " < "
38 ToolTip = " Small→Large "
39 Visibility = " Hidden " />
40 < ToggleButton
41 x: Name = " Large2Small "
42 HorizontalAlignment = " Left "
43 Content = " > "
44 IsChecked = " {Binding IsChecked, Mode=TwoWay, ElementName=Small2Large} "
45 ToolTip = " Large→Small "
46 Visibility = " Hidden " />
47 </ Grid >
48
49 < ContentPresenter
50 x: Name = " ExpandSite "
51 Margin = " 0,0,-200,0 "
52 DockPanel.Dock = " Bottom "
53 Focusable = " false "
54 Visibility = " Collapsed " />
55 </ DockPanel >
56 </ Border >
57 < ControlTemplate.Triggers >
58 <!-- Close->Small -->
59 < Trigger SourceName = " Close2Small " Property = " IsChecked " Value = " True " >
60 < Setter TargetName = " Close2Small " Property = " IsEnabled " Value = " False " />
61 < Setter TargetName = " Small2Close " Property = " Visibility " Value = " Visible " />
62 < Setter TargetName = " Small2Large " Property = " Visibility " Value = " Visible " />
63 </ Trigger >
64
65 <!-- Small->Large -->
66 < Trigger SourceName = " Small2Large " Property = " IsChecked " Value = " True " >
67 < Setter TargetName = " ExpandSite " Property = " Margin " Value = " 0 " />
68 < Setter TargetName = " Small2Large " Property = " Visibility " Value = " Hidden " />
69 < Setter TargetName = " Large2Small " Property = " Visibility " Value = " Visible " />
70 </ Trigger >
71
72 < Trigger Property = " IsExpanded " Value = " True " >
73 < Setter TargetName = " ExpandSite " Property = " Visibility " Value = " Visible " />
74 </ Trigger >
75 </ ControlTemplate.Triggers >
76 </ ControlTemplate >
77 </ Setter.Value >
78 </ Setter >
79 </ Style >
80 </ Window.Resources >
81 < Grid >
82 < Expander
83 x: Name = " Expander "
84 Margin = " 20 "
85 HorizontalAlignment = " Right "
86 Style = " {DynamicResource ExpanderStyle1} " >
87 < Rectangle
88 Width = " 400 "
89 Height = " 300 "
90 Fill = " Red " />
91 </ Expander >
92
93
94 <!-- 依存関係プロパティ値の優先順位 -->
95 < CheckBox
96 x: Name = " checkBox "
97 HorizontalAlignment = " Left "
98 VerticalAlignment = " Top "
99 Content = " Triggerのテスト " >
100 < CheckBox.Style >
101 < Style TargetType = " {x:Type CheckBox} " >
102 < Style.Triggers >
103 < Trigger Property = " IsMouseOver " Value = " True " >
104 < Setter Property = " IsChecked " Value = " True " />
105 </ Trigger >
106 <!-- ↓は無くても同じだがあったとしてもダメ -->
107 <!--<Trigger Property="IsMouseOver" Value="False">
108 <Setter Property="IsChecked" Value="False" />
109 </Trigger>-->
110 </ Style.Triggers >
111 </ Style >
112 </ CheckBox.Style >
113 </ CheckBox >
114 </ Grid >
115 </ Window >
cs
1 using System . ComponentModel ;
2 using System . Windows ;
3 using System . Windows . Controls . Primitives ;
4
5 namespace Questions300473
6 {
7 public enum ThreeState { Close , Small , Large , }
8
9 public partial class MainWindow : Window
10 {
11 public MainWindow ( ) => InitializeComponent ( ) ;
12
13 private void Window_Loaded ( object sender , RoutedEventArgs e )
14 {
15 var Small2Large = Expander . Template . FindName ( "Small2Large" , Expander ) as ToggleButton ;
16
17 switch ( Properties . Settings . Default . ExpanderOpenState )
18 {
19 default :
20 case ThreeState . Close :
21 break ;
22 case ThreeState . Small :
23 Expander . IsExpanded = true ;
24 break ;
25 case ThreeState . Large :
26 Expander . IsExpanded = true ;
27 Small2Large . IsChecked = true ;
28 break ;
29 }
30
31
32 // 依存関係プロパティ値の優先順位 Triggerのテスト
33 // あまりに露骨なので「そりゃそうだ」という気もしますが、
34 // ↓を実行するとMouseOverに反応しなくなります。
35 //checkBox.IsChecked = true;
36 }
37
38 private void Window_Closing ( object sender , CancelEventArgs e )
39 {
40 var Small2Large = Expander . Template . FindName ( "Small2Large" , Expander ) as ToggleButton ;
41 var state = ! Expander . IsExpanded ? ThreeState . Close
42 : Small2Large . IsChecked == false ? ThreeState . Small
43 : ThreeState . Large ;
44
45 Properties . Settings . Default . ExpanderOpenState = state ;
46 Properties . Settings . Default . Save ( ) ;
47 }
48 }
49 }