Browse Source

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.
pull/70/head
gumme 12 years ago
parent
commit
e7cdfc0e3a
  1. 92
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/BorderForInvisibleControl.cs

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

@ -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;
} }

Loading…
Cancel
Save