|
|
@ -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 element = ExtendedItem.Component as UIElement; |
|
|
|
{ |
|
|
|
if (element != null) { |
|
|
|
var border = ExtendedItem.Component as Border; |
|
|
|
var border = element as Border; |
|
|
|
if (border.ReadLocalValue(Border.BorderBrushProperty) == DependencyProperty.UnsetValue || border.ReadLocalValue(Border.BorderThicknessProperty) == DependencyProperty.UnsetValue) |
|
|
|
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 |
|
|
|
|
|
|
|
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 |
|
|
|
else { |
|
|
|
{ |
|
|
|
|
|
|
|
RemoveAdorner(); |
|
|
|
RemoveAdorner(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return border.BorderBrush == null || border.BorderBrush == Brushes.Transparent; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void CreateAdorner() |
|
|
|
private void CreateAdorner() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (adornerPanel == null) |
|
|
|
if (adornerPanel == null) { |
|
|
|
{ |
|
|
|
|
|
|
|
adornerPanel = new AdornerPanel(); |
|
|
|
if (cachedAdornerPanel == null) { |
|
|
|
adornerPanel.Order = AdornerOrder.Background; |
|
|
|
cachedAdornerPanel = new AdornerPanel(); |
|
|
|
var border = new Border(); |
|
|
|
cachedAdornerPanel.Order = AdornerOrder.Background; |
|
|
|
border.BorderThickness = new Thickness(1); |
|
|
|
var border = new Border(); |
|
|
|
border.BorderBrush = new SolidColorBrush(Color.FromRgb(0xCC, 0xCC, 0xCC)); |
|
|
|
border.BorderThickness = new Thickness(1); |
|
|
|
border.IsHitTestVisible = false; |
|
|
|
border.BorderBrush = new SolidColorBrush(Color.FromRgb(0xCC, 0xCC, 0xCC)); |
|
|
|
AdornerPanel.SetPlacement(border, AdornerPlacement.FillContent); |
|
|
|
border.IsHitTestVisible = false; |
|
|
|
adornerPanel.Children.Add(border); |
|
|
|
AdornerPanel.SetPlacement(border, AdornerPlacement.FillContent); |
|
|
|
|
|
|
|
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; |
|
|
|
} |
|
|
|
} |
|
|
|