@ -3,15 +3,17 @@
using System ;
using System ;
using System.Collections.Generic ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Linq ;
using System.Linq ;
using System.Text ;
using System.Text ;
using ICSharpCode.WpfDesign.Adorners ;
using ICSharpCode.WpfDesign.Extensions ;
using System.Windows.Controls ;
using System.Windows ;
using System.Windows ;
using ICSharpCode.WpfDesign.Designer .Controls;
using System.Windows.Controls ;
using System.Windows.Media ;
using System.Windows.Media ;
using ICSharpCode.WpfDesign.Adorners ;
using ICSharpCode.WpfDesign.Designer.Controls ;
using ICSharpCode.WpfDesign.Extensions ;
namespace ICSharpCode.WpfDesign.Designer.Extensions
namespace ICSharpCode.WpfDesign.Designer.Extensions
{
{
[ExtensionFor(typeof(Panel))]
[ExtensionFor(typeof(Panel))]
@ -21,6 +23,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
public class BorderForInvisibleControl : PermanentAdornerProvider
public class BorderForInvisibleControl : PermanentAdornerProvider
{
{
AdornerPanel adornerPanel ;
AdornerPanel adornerPanel ;
AdornerPanel cachedAdornerPanel ;
protected override void OnInitialized ( )
protected override void OnInitialized ( )
{
{
@ -28,52 +31,79 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
if ( ExtendedItem . Component is Border )
if ( ExtendedItem . Component is Border )
{
{
ExtendedItem . PropertyChanged + = ( s , e ) = > ExtendedItem_PropertyChanged ( ) ;
ExtendedItem . PropertyChanged + = ( s , e ) = > UpdateAdorner ( ) ;
}
// If component is a ContentControl it must be of type ContentControl specifically, and not derived types like Label and Button.
if ( ! ( ExtendedItem . Component is ContentControl ) | | ExtendedItem . Component . GetType ( ) = = typeof ( ContentControl ) ) {
UpdateAdorner ( ) ;
ExtendedItem_PropertyChanged ( ) ;
var element = ExtendedItem . Component as UIElement ;
if ( element ! = null ) {
element . IsVisibleChanged + = ( s , e ) = > UpdateAdorner ( ) ;
}
}
else if ( ExtendedItem . Component is Panel | | ExtendedItem . Component is Viewbox | | ExtendedItem . Component is ContentControl )
{
CreateAdorner ( ) ;
}
}
}
}
void ExtendedItem_PropertyChanged ( )
void UpdateAdorner ( )
{
if ( ExtendedItem . Component is Border )
{
var border = ExtendedItem . Component as Border ;
if ( border . ReadLocalValue ( Border . BorderBrushProperty ) = = DependencyProperty . UnsetValue | | border . ReadLocalValue ( Border . BorderThicknessProperty ) = = DependencyProperty . UnsetValue )
{
{
var element = ExtendedItem . Component as UIElement ;
if ( element ! = null ) {
var border = element as Border ;
if ( element . IsVisible & & ( border = = null | | IsAnyBorderEdgeInvisible ( border ) ) ) {
CreateAdorner ( ) ;
CreateAdorner ( ) ;
}
if ( border ! = null ) {
var adornerBorder = ( Border ) adornerPanel . Children [ 0 ] ;
if ( IsBorderBrushInvisible ( border ) )
adornerBorder . BorderThickness = new Thickness ( 1 ) ;
else
else
{
adornerBorder . BorderThickness = new Thickness ( border . BorderThickness . Left > 0 ? 0 : 1 ,
border . BorderThickness . Top > 0 ? 0 : 1 ,
border . BorderThickness . Right > 0 ? 0 : 1 ,
border . BorderThickness . Bottom > 0 ? 0 : 1 ) ;
}
}
else {
RemoveAdorner ( ) ;
RemoveAdorner ( ) ;
}
}
}
}
}
}
private void CreateAdorner ( )
bool IsAnyBorderEdgeInvisible ( Border border )
{
return IsBorderBrushInvisible ( border ) | | border . BorderThickness . Left = = 0 | | border . BorderThickness . Top = = 0 | | border . BorderThickness . Right = = 0 | | border . BorderThickness . Bottom = = 0 ;
}
bool IsBorderBrushInvisible ( Border border )
{
{
if ( adornerPanel = = null )
return border . BorderBrush = = null | | border . BorderBrush = = Brushes . Transparent ;
}
private void CreateAdorner ( )
{
{
adornerPanel = new AdornerPanel ( ) ;
if ( adornerPanel = = null ) {
adornerPanel . Order = AdornerOrder . Background ;
if ( cachedAdornerPanel = = null ) {
cachedAdornerPanel = new AdornerPanel ( ) ;
cachedAdornerPanel . Order = AdornerOrder . Background ;
var border = new Border ( ) ;
var border = new Border ( ) ;
border . BorderThickness = new Thickness ( 1 ) ;
border . BorderThickness = new Thickness ( 1 ) ;
border . BorderBrush = new SolidColorBrush ( Color . FromRgb ( 0xCC , 0xCC , 0xCC ) ) ;
border . BorderBrush = new SolidColorBrush ( Color . FromRgb ( 0xCC , 0xCC , 0xCC ) ) ;
border . IsHitTestVisible = false ;
border . IsHitTestVisible = false ;
AdornerPanel . SetPlacement ( border , AdornerPlacement . FillContent ) ;
AdornerPanel . SetPlacement ( border , AdornerPlacement . FillContent ) ;
adornerPanel . Children . Add ( border ) ;
cachedAdornerPanel . Children . Add ( border ) ;
}
adornerPanel = cachedAdornerPanel ;
Adorners . Add ( adornerPanel ) ;
Adorners . Add ( adornerPanel ) ;
}
}
}
}
private void RemoveAdorner ( )
private void RemoveAdorner ( )
{
{
if ( adornerPanel ! = null )
if ( adornerPanel ! = null ) {
{
Adorners . Remove ( adornerPanel ) ;
Adorners . Remove ( adornerPanel ) ;
adornerPanel = null ;
adornerPanel = null ;
}
}