Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit e7cdfc0

Browse files
author
gumme
committed
Some fixes to BorderForInvisibleControl adorner as follows;
Only shows the adorner panel if the parent component is visible. If component is a ContentControl it must be of type ContentControl specifically, and not derived types like Label and Button where the added border is not wanted. If component is a Border the adorner border is only drawn on the edges that is invisible. The adorner is only created the first time it is added to adorners collection.
1 parent 75dc746 commit e7cdfc0

1 file changed

Lines changed: 61 additions & 31 deletions

File tree

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/BorderForInvisibleControl.cs

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.ComponentModel;
67
using System.Linq;
78
using System.Text;
8-
using ICSharpCode.WpfDesign.Adorners;
9-
using ICSharpCode.WpfDesign.Extensions;
10-
using System.Windows.Controls;
119
using System.Windows;
12-
using ICSharpCode.WpfDesign.Designer.Controls;
10+
using System.Windows.Controls;
1311
using System.Windows.Media;
1412

13+
using ICSharpCode.WpfDesign.Adorners;
14+
using ICSharpCode.WpfDesign.Designer.Controls;
15+
using ICSharpCode.WpfDesign.Extensions;
16+
1517
namespace 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

Comments
 (0)