Browse Source

Better support for Lookless Controls:

- Border, Viewbox, ContentControl....
pull/52/head
jkuehner 12 years ago
parent
commit
c09ab8c072
  1. 64
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/BorderForInvisibleControl.cs
  2. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/DefaultPlacementBehavior.cs
  3. 26
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PanelInstanceFactory.cs
  4. 5
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PanelMove.cs
  5. 3
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/TopLeftContainerDragHandle.cs

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

@ -15,20 +15,68 @@ using System.Windows.Media; @@ -15,20 +15,68 @@ using System.Windows.Media;
namespace ICSharpCode.WpfDesign.Designer.Extensions
{
[ExtensionFor(typeof(Panel))]
[ExtensionFor(typeof(Border))]
[ExtensionFor(typeof(ContentControl))]
[ExtensionFor(typeof(Viewbox))]
public class BorderForInvisibleControl : PermanentAdornerProvider
{
AdornerPanel adornerPanel;
protected override void OnInitialized()
{
base.OnInitialized();
var adornerPanel = new AdornerPanel();
var border = new Border();
border.BorderThickness = new Thickness(1);
border.BorderBrush = new SolidColorBrush(Color.FromRgb(0xCC, 0xCC, 0xCC));
border.IsHitTestVisible = false;
AdornerPanel.SetPlacement(border, AdornerPlacement.FillContent);
adornerPanel.Children.Add(border);
Adorners.Add(adornerPanel);
if (ExtendedItem.Component is Border)
{
ExtendedItem.PropertyChanged+= (s, e) => ExtendedItem_PropertyChanged();
ExtendedItem_PropertyChanged();
}
else if (ExtendedItem.Component is Panel || ExtendedItem.Component is Viewbox || ExtendedItem.Component is ContentControl)
{
CreateAdorner();
}
}
void ExtendedItem_PropertyChanged()
{
if (ExtendedItem.Component is Border)
{
var border = ExtendedItem.Component as Border;
if (border.ReadLocalValue(Border.BorderBrushProperty) == DependencyProperty.UnsetValue || border.ReadLocalValue(Border.BorderThicknessProperty) == DependencyProperty.UnsetValue)
{
CreateAdorner();
}
else
{
RemoveAdorner();
}
}
}
private void CreateAdorner()
{
if (adornerPanel == null)
{
adornerPanel = new AdornerPanel();
adornerPanel.Order = AdornerOrder.Background;
var border = new Border();
border.BorderThickness = new Thickness(1);
border.BorderBrush = new SolidColorBrush(Color.FromRgb(0xCC, 0xCC, 0xCC));
border.IsHitTestVisible = false;
AdornerPanel.SetPlacement(border, AdornerPlacement.FillContent);
adornerPanel.Children.Add(border);
Adorners.Add(adornerPanel);
}
}
private void RemoveAdorner()
{
if (adornerPanel != null)
{
Adorners.Remove(adornerPanel);
adornerPanel = null;
}
}
}
}

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/DefaultPlacementBehavior.cs

@ -18,6 +18,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -18,6 +18,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
{
[ExtensionFor(typeof(Panel))]
[ExtensionFor(typeof(ContentControl))]
[ExtensionFor(typeof(Border))]
[ExtensionFor(typeof(Viewbox))]
public class DefaultPlacementBehavior : BehaviorExtension, IPlacementBehavior
{
static List<Type> _contentControlsNotAllowedToAdd;

26
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PanelInstanceFactory.cs

@ -64,6 +64,32 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -64,6 +64,32 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
}
}
[ExtensionFor(typeof(Border))]
public sealed class BorderInstanceFactory : CustomInstanceFactory
{
Brush _transparentBrush = new SolidColorBrush(Colors.Transparent);
/// <summary>
/// Creates an instance of the specified type, passing the specified arguments to its constructor.
/// </summary>
public override object CreateInstance(Type type, params object[] arguments)
{
object instance = base.CreateInstance(type, arguments);
Border panel = instance as Border;
if (panel != null)
{
if (panel.Background == null)
{
panel.Background = _transparentBrush;
}
TypeDescriptionProvider provider = new DummyValueInsteadOfNullTypeDescriptionProvider(
TypeDescriptor.GetProvider(panel), "Background", _transparentBrush);
TypeDescriptor.AddProvider(provider, panel);
}
return instance;
}
}
sealed class DummyValueInsteadOfNullTypeDescriptionProvider : TypeDescriptionProvider
{
// By using a TypeDescriptionProvider, we can intercept all access to the property that is

5
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PanelMove.cs

@ -14,6 +14,9 @@ using ICSharpCode.WpfDesign.Designer.Controls; @@ -14,6 +14,9 @@ using ICSharpCode.WpfDesign.Designer.Controls;
namespace ICSharpCode.WpfDesign.Designer.Extensions
{
[ExtensionFor(typeof(Panel))]
[ExtensionFor(typeof(Border))]
[ExtensionFor(typeof(ContentControl))]
[ExtensionFor(typeof(Viewbox))]
public class PanelMove : PermanentAdornerProvider
{
protected override void OnInitialized()
@ -24,7 +27,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -24,7 +27,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var adorner = new PanelMoveAdorner(ExtendedItem);
AdornerPanel.SetPlacement(adorner, AdornerPlacement.FillContent);
adornerPanel.Children.Add(adorner);
Adorners.Add(adornerPanel);
Adorners.Add(adornerPanel);
}
}
}

3
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/TopLeftContainerDragHandle.cs

@ -24,6 +24,9 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions @@ -24,6 +24,9 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
[ExtensionFor(typeof(Image))]
[ExtensionFor(typeof(MediaElement))]
[ExtensionFor(typeof(ItemsControl))]
[ExtensionFor(typeof(Border))]
[ExtensionFor(typeof(Viewbox))]
[ExtensionFor(typeof(ContentControl))]
public class TopLeftContainerDragHandle : AdornerProvider
{
/// <summary/>

Loading…
Cancel
Save