33
44using System ;
55using System . Collections . Generic ;
6+ using System . ComponentModel ;
67using System . Linq ;
78using System . Text ;
8- using ICSharpCode . WpfDesign . Adorners ;
9- using ICSharpCode . WpfDesign . Extensions ;
10- using System . Windows . Controls ;
119using System . Windows ;
12- using ICSharpCode . WpfDesign . Designer . Controls ;
10+ using System . Windows . Controls ;
1311using System . Windows . Media ;
1412
13+ using ICSharpCode . WpfDesign . Adorners ;
14+ using ICSharpCode . WpfDesign . Designer . Controls ;
15+ using ICSharpCode . WpfDesign . Extensions ;
16+
1517namespace ICSharpCode . WpfDesign . Designer . Extensions
1618{
1719 [ ExtensionFor ( typeof ( Panel ) ) ]
@@ -21,59 +23,87 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
2123 public class BorderForInvisibleControl : PermanentAdornerProvider
2224 {
2325 AdornerPanel adornerPanel ;
26+ AdornerPanel cachedAdornerPanel ;
2427
2528 protected override void OnInitialized ( )
2629 {
2730 base . OnInitialized ( ) ;
2831
2932 if ( ExtendedItem . Component is Border )
3033 {
31- ExtendedItem . PropertyChanged += ( s , e ) => ExtendedItem_PropertyChanged ( ) ;
34+ ExtendedItem . PropertyChanged += ( s , e ) => UpdateAdorner ( ) ;
35+ }
36+
37+ // If component is a ContentControl it must be of type ContentControl specifically, and not derived types like Label and Button.
38+ if ( ! ( ExtendedItem . Component is ContentControl ) || ExtendedItem . Component . GetType ( ) == typeof ( ContentControl ) ) {
39+ UpdateAdorner ( ) ;
3240
33- ExtendedItem_PropertyChanged ( ) ;
41+ var element = ExtendedItem . Component as UIElement ;
42+ if ( element != null ) {
43+ element . IsVisibleChanged += ( s , e ) => UpdateAdorner ( ) ;
44+ }
3445 }
35- else if ( ExtendedItem . Component is Panel || ExtendedItem . Component is Viewbox || ExtendedItem . Component is ContentControl )
36- {
37- CreateAdorner ( ) ;
38- }
3946 }
4047
41- void ExtendedItem_PropertyChanged ( )
48+ void UpdateAdorner ( )
4249 {
43- if ( ExtendedItem . Component is Border )
44- {
45- var border = ExtendedItem . Component as Border ;
46- if ( border . ReadLocalValue ( Border . BorderBrushProperty ) == DependencyProperty . UnsetValue || border . ReadLocalValue ( Border . BorderThicknessProperty ) == DependencyProperty . UnsetValue )
47- {
50+ var element = ExtendedItem . Component as UIElement ;
51+ if ( element != null ) {
52+ var border = element as Border ;
53+ if ( element . IsVisible && ( border == null || IsAnyBorderEdgeInvisible ( border ) ) ) {
4854 CreateAdorner ( ) ;
55+
56+ if ( border != null ) {
57+ var adornerBorder = ( Border ) adornerPanel . Children [ 0 ] ;
58+
59+ if ( IsBorderBrushInvisible ( border ) )
60+ adornerBorder . BorderThickness = new Thickness ( 1 ) ;
61+ else
62+ adornerBorder . BorderThickness = new Thickness ( border . BorderThickness . Left > 0 ? 0 : 1 ,
63+ border . BorderThickness . Top > 0 ? 0 : 1 ,
64+ border . BorderThickness . Right > 0 ? 0 : 1 ,
65+ border . BorderThickness . Bottom > 0 ? 0 : 1 ) ;
66+ }
4967 }
50- else
51- {
68+ else {
5269 RemoveAdorner ( ) ;
5370 }
54- }
71+ }
72+ }
73+
74+ bool IsAnyBorderEdgeInvisible ( Border border )
75+ {
76+ return IsBorderBrushInvisible ( border ) || border . BorderThickness . Left == 0 || border . BorderThickness . Top == 0 || border . BorderThickness . Right == 0 || border . BorderThickness . Bottom == 0 ;
77+ }
78+
79+ bool IsBorderBrushInvisible ( Border border )
80+ {
81+ return border . BorderBrush == null || border . BorderBrush == Brushes . Transparent ;
5582 }
5683
5784 private void CreateAdorner ( )
5885 {
59- if ( adornerPanel == null )
60- {
61- adornerPanel = new AdornerPanel ( ) ;
62- adornerPanel . Order = AdornerOrder . Background ;
63- var border = new Border ( ) ;
64- border . BorderThickness = new Thickness ( 1 ) ;
65- border . BorderBrush = new SolidColorBrush ( Color . FromRgb ( 0xCC , 0xCC , 0xCC ) ) ;
66- border . IsHitTestVisible = false ;
67- AdornerPanel . SetPlacement ( border , AdornerPlacement . FillContent ) ;
68- adornerPanel . Children . Add ( border ) ;
86+ if ( adornerPanel == null ) {
87+
88+ if ( cachedAdornerPanel == null ) {
89+ cachedAdornerPanel = new AdornerPanel ( ) ;
90+ cachedAdornerPanel . Order = AdornerOrder . Background ;
91+ var border = new Border ( ) ;
92+ border . BorderThickness = new Thickness ( 1 ) ;
93+ border . BorderBrush = new SolidColorBrush ( Color . FromRgb ( 0xCC , 0xCC , 0xCC ) ) ;
94+ border . IsHitTestVisible = false ;
95+ AdornerPanel . SetPlacement ( border , AdornerPlacement . FillContent ) ;
96+ cachedAdornerPanel . Children . Add ( border ) ;
97+ }
98+
99+ adornerPanel = cachedAdornerPanel ;
69100 Adorners . Add ( adornerPanel ) ;
70101 }
71102 }
72103
73104 private void RemoveAdorner ( )
74105 {
75- if ( adornerPanel != null )
76- {
106+ if ( adornerPanel != null ) {
77107 Adorners . Remove ( adornerPanel ) ;
78108 adornerPanel = null ;
79109 }
0 commit comments