Browse Source

- Improve PropertyGrid performance (select, move, undo much faster now)

- Try another category set
- In PropertyGrid: Colorize Binding, Resources; "(type)" / disable TextBox where needed
- Bug fixing: XamlProperty.IsSet now works correctly, ...

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3434 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Ivan Shumilin 18 years ago
parent
commit
b2015b1d0b
  1. 2
      samples/XamlDesigner/XamlDesigner.csproj
  2. 578
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/BasicMetadata.cs
  3. 1
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/NumericUpDown.xaml
  4. 16
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Converters.cs
  5. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ExtensionMethods.cs
  6. 1
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/SnaplinePlacementBehavior.cs
  7. 17
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/NumberEditor.xaml
  8. 173
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
  9. 31
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml
  10. 1
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
  11. 14
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs
  12. 23
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs
  13. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItemProperty.cs
  14. 124
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs
  15. 41
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/Category.cs
  16. 172
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs
  17. 44
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/SortedObservableCollection.cs
  18. 3
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj

2
samples/XamlDesigner/XamlDesigner.csproj

@ -134,7 +134,7 @@
<ItemGroup> <ItemGroup>
<None Include="NewFileTemplate.xaml"> <None Include="NewFileTemplate.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<Page Include="BitmapButton.xaml"> <Page Include="BitmapButton.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

578
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/BasicMetadata.cs

@ -13,23 +13,14 @@ using System.Windows.Media.Media3D;
using System.Windows.Shapes; using System.Windows.Shapes;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Automation;
using System.Windows.Media.Effects;
using System.Windows.Navigation;
namespace ICSharpCode.WpfDesign.Designer namespace ICSharpCode.WpfDesign.Designer
{ {
public class BasicMetadata public class BasicMetadata
{ {
public const string Category_Brushes = "Brushes";
public const string Category_Text = "Text";
public const string Category_Appearance = "Appearance";
public const string Category_Layout = "Layout";
public const string Category_Common_Properties = "Common Properties";
public const string Category_Misc = "Misc";
public const string Category_Transform = "Transform";
public const string Category_Media = "Media";
public const string Category_Light = "Light";
public const string Category_Camera = "Camera";
public const string Category_Materials = "Materials";
public BasicMetadata() public BasicMetadata()
{ {
Metadata.AddStandardValues(typeof(Brush), typeof(Brushes)); Metadata.AddStandardValues(typeof(Brush), typeof(Brushes));
@ -42,454 +33,103 @@ namespace ICSharpCode.WpfDesign.Designer
Metadata.AddStandardValues(typeof(TextDecorationCollection), typeof(TextDecorations)); Metadata.AddStandardValues(typeof(TextDecorationCollection), typeof(TextDecorations));
Metadata.AddStandardValues(typeof(FontFamily), Fonts.SystemFontFamilies); Metadata.AddStandardValues(typeof(FontFamily), Fonts.SystemFontFamilies);
//Metadata.AddStandardValues(typeof(ICommand), typeof(ApplicationCommands)); Metadata.AddStandardValues(typeof(ICommand), typeof(ApplicationCommands));
//Metadata.AddStandardValues(typeof(ICommand), typeof(EditingCommands)); Metadata.AddStandardValues(typeof(ICommand), typeof(EditingCommands));
//Metadata.AddStandardValues(typeof(ICommand), typeof(NavigationCommands)); Metadata.AddStandardValues(typeof(ICommand), typeof(NavigationCommands));
//Metadata.AddStandardValues(typeof(ICommand), typeof(ComponentCommands)); Metadata.AddStandardValues(typeof(ICommand), typeof(ComponentCommands));
//Metadata.AddStandardValues(typeof(ICommand), typeof(MediaCommands)); Metadata.AddStandardValues(typeof(ICommand), typeof(MediaCommands));
Metadata.CategoryOrder = new[] {
Category_Brushes,
Category_Appearance,
Category_Layout,
Category_Common_Properties,
Category_Text,
Category_Transform,
Category_Media,
Category_Light,
Category_Camera,
Category_Brushes,
Category_Materials,
Category_Misc
};
Metadata.AddCategory(AccessText.TextProperty, Category_Text); Metadata.AddPopularProperty(Line.Y2Property);
Metadata.AddCategory(Block.BorderBrushProperty, Category_Appearance); Metadata.AddPopularProperty(NavigationWindow.ShowsNavigationUIProperty);
Metadata.AddCategory(Block.BorderThicknessProperty, Category_Appearance); Metadata.AddPopularProperty(FlowDocumentScrollViewer.DocumentProperty);
Metadata.AddCategory(Block.BreakColumnBeforeProperty, Category_Text); Metadata.AddPopularProperty(GridViewRowPresenterBase.ColumnsProperty);
Metadata.AddCategory(Block.BreakPageBeforeProperty, Category_Text); Metadata.AddPopularProperty(ListView.ViewProperty);
Metadata.AddCategory(Block.LineHeightProperty, Category_Layout); Metadata.AddPopularProperty(DocumentPageView.PageNumberProperty);
Metadata.AddCategory(Block.MarginProperty, Category_Layout); Metadata.AddPopularProperty(Popup.PlacementProperty);
Metadata.AddCategory(Block.PaddingProperty, Category_Layout); Metadata.AddPopularProperty(Popup.PopupAnimationProperty);
Metadata.AddCategory(Block.TextAlignmentProperty, Category_Text); Metadata.AddPopularProperty(ScrollBar.ViewportSizeProperty);
Metadata.AddCategory(Border.BorderBrushProperty, Category_Brushes); Metadata.AddPopularProperty(UniformGrid.RowsProperty);
Metadata.AddCategory(Border.BorderThicknessProperty, Category_Appearance); Metadata.AddPopularProperty(TabControl.TabStripPlacementProperty);
Metadata.AddCategory(Border.CornerRadiusProperty, Category_Appearance); Metadata.AddPopularProperty(Line.X1Property);
Metadata.AddCategory(Border.PaddingProperty, Category_Layout); Metadata.AddPopularProperty(Line.Y1Property);
Metadata.AddCategory(Button.IsCancelProperty, Category_Common_Properties); Metadata.AddPopularProperty(Line.X2Property);
Metadata.AddCategory(Button.IsDefaultProperty, Category_Common_Properties); Metadata.AddPopularProperty(Polygon.PointsProperty);
Metadata.AddCategory(ButtonBase.ClickModeProperty, Category_Misc); Metadata.AddPopularProperty(Polyline.PointsProperty);
Metadata.AddCategory(ButtonBase.CommandParameterProperty, Category_Misc); Metadata.AddPopularProperty(Path.DataProperty);
Metadata.AddCategory(ButtonBase.CommandProperty, Category_Misc); Metadata.AddPopularProperty(HeaderedContentControl.HeaderProperty);
Metadata.AddCategory(ButtonBase.CommandTargetProperty, Category_Misc); Metadata.AddPopularProperty(MediaElement.UnloadedBehaviorProperty);
Metadata.AddCategory(ButtonBase.IsPressedProperty, Category_Common_Properties); Metadata.AddPopularProperty(Shape.FillProperty);
Metadata.AddCategory(Camera.TransformProperty, Category_Transform); Metadata.AddPopularProperty(Page.TitleProperty);
Metadata.AddCategory(Canvas.BottomProperty, Category_Layout); Metadata.AddPopularProperty(ItemsControl.ItemsSourceProperty);
Metadata.AddCategory(Canvas.LeftProperty, Category_Layout); Metadata.AddPopularProperty(Image.SourceProperty);
Metadata.AddCategory(Canvas.RightProperty, Category_Layout); Metadata.AddPopularProperty(TextBlock.TextProperty);
Metadata.AddCategory(Canvas.TopProperty, Category_Layout); Metadata.AddPopularProperty(DockPanel.LastChildFillProperty);
Metadata.AddCategory(ColumnDefinition.MaxWidthProperty, Category_Layout); Metadata.AddPopularProperty(Expander.IsExpandedProperty);
Metadata.AddCategory(ColumnDefinition.MinWidthProperty, Category_Layout); Metadata.AddPopularProperty(Shape.StrokeProperty);
Metadata.AddCategory(ColumnDefinition.WidthProperty, Category_Layout); Metadata.AddPopularProperty(RangeBase.ValueProperty);
Metadata.AddCategory(ComboBox.IsDropDownOpenProperty, Category_Common_Properties); Metadata.AddPopularProperty(ItemsControl.ItemContainerStyleProperty);
Metadata.AddCategory(ComboBox.IsEditableProperty, Category_Common_Properties); Metadata.AddPopularProperty(ToggleButton.IsCheckedProperty);
Metadata.AddCategory(ComboBox.StaysOpenOnEditProperty, Category_Common_Properties); Metadata.AddPopularProperty(Window.TitleProperty);
Metadata.AddCategory(ComboBox.TextProperty, Category_Common_Properties); Metadata.AddPopularProperty(Viewport3DVisual.CameraProperty);
Metadata.AddCategory(ContentControl.ContentProperty, Category_Common_Properties); Metadata.AddPopularProperty(Frame.SourceProperty);
Metadata.AddCategory(ContentControl.ContentTemplateProperty, Category_Misc); Metadata.AddPopularProperty(Rectangle.RadiusXProperty);
Metadata.AddCategory(ContentControl.ContentTemplateSelectorProperty, Category_Misc); Metadata.AddPopularProperty(Rectangle.RadiusYProperty);
Metadata.AddCategory(Control.HorizontalContentAlignmentProperty, Category_Layout); Metadata.AddPopularProperty(FrameworkElement.HeightProperty);
Metadata.AddCategory(Control.PaddingProperty, Category_Layout); Metadata.AddPopularProperty(FrameworkElement.WidthProperty);
Metadata.AddCategory(Control.VerticalContentAlignmentProperty, Category_Layout); Metadata.AddPopularProperty(UniformGrid.ColumnsProperty);
Metadata.AddCategory(DashStyle.DashesProperty, Category_Appearance); Metadata.AddPopularProperty(RangeBase.MinimumProperty);
Metadata.AddCategory(DiffuseMaterial.BrushProperty, Category_Appearance); Metadata.AddPopularProperty(RangeBase.MaximumProperty);
Metadata.AddCategory(DirectionalLight.DirectionProperty, Category_Light); Metadata.AddPopularProperty(ScrollBar.OrientationProperty);
Metadata.AddCategory(DockPanel.DockProperty, Category_Layout); Metadata.AddPopularProperty(ContentControl.ContentProperty);
Metadata.AddCategory(DockPanel.LastChildFillProperty, Category_Layout); Metadata.AddPopularProperty(Popup.IsOpenProperty);
Metadata.AddCategory(DocumentViewer.ExtentHeightProperty, Category_Layout); Metadata.AddPopularProperty(TextElement.FontSizeProperty);
Metadata.AddCategory(DocumentViewer.ExtentWidthProperty, Category_Layout); Metadata.AddPopularProperty(FrameworkElement.NameProperty);
Metadata.AddCategory(DocumentViewer.HorizontalOffsetProperty, Category_Layout); Metadata.AddPopularProperty(Popup.HorizontalOffsetProperty);
Metadata.AddCategory(DocumentViewer.HorizontalPageSpacingProperty, Category_Layout); Metadata.AddPopularProperty(Popup.VerticalOffsetProperty);
Metadata.AddCategory(DocumentViewer.ViewportHeightProperty, Category_Layout); Metadata.AddPopularProperty(Window.WindowStyleProperty);
Metadata.AddCategory(DocumentViewer.ViewportWidthProperty, Category_Layout); Metadata.AddPopularProperty(Shape.StrokeThicknessProperty);
Metadata.AddCategory(DrawingGroup.ClipGeometryProperty, Category_Appearance); Metadata.AddPopularProperty(TextElement.ForegroundProperty);
Metadata.AddCategory(DrawingGroup.OpacityProperty, Category_Appearance); Metadata.AddPopularProperty(FrameworkElement.VerticalAlignmentProperty);
Metadata.AddCategory(EllipseGeometry.CenterProperty, Category_Layout); Metadata.AddPopularProperty(Button.IsDefaultProperty);
Metadata.AddCategory(EmissiveMaterial.BrushProperty, Category_Appearance); Metadata.AddPopularProperty(UIElement.RenderTransformOriginProperty);
Metadata.AddCategory(Expander.ExpandDirectionProperty, Category_Common_Properties); Metadata.AddPopularProperty(TextElement.FontFamilyProperty);
Metadata.AddCategory(Expander.IsExpandedProperty, Category_Common_Properties); Metadata.AddPopularProperty(FrameworkElement.HorizontalAlignmentProperty);
Metadata.AddCategory(Figure.HeightProperty, Category_Layout); Metadata.AddPopularProperty(ToolBar.BandProperty);
Metadata.AddCategory(Figure.HorizontalAnchorProperty, Category_Layout); Metadata.AddPopularProperty(ToolBar.BandIndexProperty);
Metadata.AddCategory(Figure.HorizontalOffsetProperty, Category_Layout); Metadata.AddPopularProperty(ItemsControl.ItemTemplateProperty);
Metadata.AddCategory(Figure.VerticalAnchorProperty, Category_Layout); Metadata.AddPopularProperty(TextBlock.TextWrappingProperty);
Metadata.AddCategory(Figure.VerticalOffsetProperty, Category_Layout); Metadata.AddPopularProperty(FrameworkElement.MarginProperty);
Metadata.AddCategory(Figure.WidthProperty, Category_Layout); Metadata.AddPopularProperty(RangeBase.LargeChangeProperty);
Metadata.AddCategory(FixedPage.ContentBoxProperty, Category_Layout); Metadata.AddPopularProperty(RangeBase.SmallChangeProperty);
Metadata.AddCategory(Floater.WidthProperty, Category_Layout); Metadata.AddPopularProperty(Panel.BackgroundProperty);
Metadata.AddCategory(FlowDocument.ColumnGapProperty, Category_Layout); Metadata.AddPopularProperty(Shape.StrokeMiterLimitProperty);
Metadata.AddCategory(FlowDocument.ColumnRuleBrushProperty, Category_Layout); Metadata.AddPopularProperty(TextElement.FontWeightProperty);
Metadata.AddCategory(FlowDocument.ColumnRuleWidthProperty, Category_Layout); Metadata.AddPopularProperty(StackPanel.OrientationProperty);
Metadata.AddCategory(FlowDocument.ColumnWidthProperty, Category_Layout); Metadata.AddPopularProperty(ListBox.SelectionModeProperty);
Metadata.AddCategory(FlowDocument.IsColumnWidthFlexibleProperty, Category_Layout); Metadata.AddPopularProperty(FrameworkElement.StyleProperty);
Metadata.AddCategory(FormatConvertedBitmap.AlphaThresholdProperty, Category_Appearance); Metadata.AddPopularProperty(TextBox.TextProperty);
Metadata.AddCategory(Frame.NavigationUIVisibilityProperty, Category_Common_Properties); Metadata.AddPopularProperty(Window.SizeToContentProperty);
Metadata.AddCategory(Frame.SourceProperty, Category_Common_Properties); Metadata.AddPopularProperty(Window.ResizeModeProperty);
Metadata.AddCategory(FrameworkElement.ActualHeightProperty, Category_Layout); Metadata.AddPopularProperty(TextBlock.TextTrimmingProperty);
Metadata.AddCategory(FrameworkElement.ActualWidthProperty, Category_Layout); Metadata.AddPopularProperty(Window.ShowInTaskbarProperty);
Metadata.AddCategory(FrameworkElement.CursorProperty, Category_Common_Properties); Metadata.AddPopularProperty(Window.IconProperty);
Metadata.AddCategory(FrameworkElement.DataContextProperty, Category_Common_Properties); Metadata.AddPopularProperty(UIElement.RenderTransformProperty);
Metadata.AddCategory(FrameworkElement.HeightProperty, Category_Layout); Metadata.AddPopularProperty(Button.IsCancelProperty);
Metadata.AddCategory(FrameworkElement.HorizontalAlignmentProperty, Category_Layout); Metadata.AddPopularProperty(Border.BorderBrushProperty);
Metadata.AddCategory(FrameworkElement.LayoutTransformProperty, Category_Transform); Metadata.AddPopularProperty(Block.TextAlignmentProperty);
Metadata.AddCategory(FrameworkElement.MarginProperty, Category_Layout); Metadata.AddPopularProperty(Border.CornerRadiusProperty);
Metadata.AddCategory(FrameworkElement.MaxHeightProperty, Category_Layout); Metadata.AddPopularProperty(Border.BorderThicknessProperty);
Metadata.AddCategory(FrameworkElement.MaxWidthProperty, Category_Layout); Metadata.AddPopularProperty(TreeViewItem.IsSelectedProperty);
Metadata.AddCategory(FrameworkElement.MinHeightProperty, Category_Layout); Metadata.AddPopularProperty(Border.PaddingProperty);
Metadata.AddCategory(FrameworkElement.MinWidthProperty, Category_Layout); Metadata.AddPopularProperty(Shape.StretchProperty);
Metadata.AddCategory(FrameworkElement.TagProperty, Category_Common_Properties);
Metadata.AddCategory(FrameworkElement.VerticalAlignmentProperty, Category_Layout);
Metadata.AddCategory(FrameworkElement.WidthProperty, Category_Layout);
Metadata.AddCategory(Geometry.TransformProperty, Category_Transform);
Metadata.AddCategory(GeometryDrawing.BrushProperty, Category_Appearance);
Metadata.AddCategory(GeometryGroup.FillRuleProperty, Category_Appearance);
Metadata.AddCategory(GeometryModel3D.BackMaterialProperty, Category_Materials);
Metadata.AddCategory(GeometryModel3D.MaterialProperty, Category_Materials);
Metadata.AddCategory(GlyphRunDrawing.ForegroundBrushProperty, Category_Appearance);
Metadata.AddCategory(Glyphs.FillProperty, Category_Appearance);
Metadata.AddCategory(Glyphs.FontRenderingEmSizeProperty, Category_Text);
Metadata.AddCategory(Glyphs.FontUriProperty, Category_Text);
Metadata.AddCategory(GradientStop.ColorProperty, Category_Appearance);
Metadata.AddCategory(Grid.ColumnProperty, Category_Layout);
Metadata.AddCategory(Grid.ColumnSpanProperty, Category_Layout);
Metadata.AddCategory(Grid.IsSharedSizeScopeProperty, Category_Layout);
Metadata.AddCategory(Grid.RowProperty, Category_Layout);
Metadata.AddCategory(Grid.RowSpanProperty, Category_Layout);
Metadata.AddCategory(Grid.ShowGridLinesProperty, Category_Layout);
Metadata.AddCategory(GridSplitter.DragIncrementProperty, Category_Common_Properties);
Metadata.AddCategory(GridSplitter.ResizeBehaviorProperty, Category_Common_Properties);
Metadata.AddCategory(GridSplitter.ResizeDirectionProperty, Category_Common_Properties);
Metadata.AddCategory(GridSplitter.ShowsPreviewProperty, Category_Common_Properties);
Metadata.AddCategory(HeaderedContentControl.HeaderProperty, Category_Common_Properties);
Metadata.AddCategory(HeaderedContentControl.HeaderTemplateProperty, Category_Misc);
Metadata.AddCategory(HeaderedContentControl.HeaderTemplateSelectorProperty, Category_Misc);
Metadata.AddCategory(Image.SourceProperty, Category_Common_Properties);
Metadata.AddCategory(InkCanvas.EditingModeProperty, Category_Common_Properties);
Metadata.AddCategory(Inline.TextDecorationsProperty, Category_Text);
Metadata.AddCategory(ItemsControl.DisplayMemberPathProperty, Category_Common_Properties);
Metadata.AddCategory(ItemsControl.IsTextSearchEnabledProperty, Category_Common_Properties);
Metadata.AddCategory(ItemsControl.ItemContainerStyleProperty, Category_Misc);
Metadata.AddCategory(ItemsControl.ItemContainerStyleSelectorProperty, Category_Misc);
Metadata.AddCategory(ItemsControl.ItemsSourceProperty, Category_Common_Properties);
Metadata.AddCategory(ItemsControl.ItemTemplateProperty, Category_Misc);
Metadata.AddCategory(ItemsControl.ItemTemplateSelectorProperty, Category_Misc);
Metadata.AddCategory(Light.ColorProperty, Category_Light);
Metadata.AddCategory(Line.X1Property, Category_Appearance);
Metadata.AddCategory(Line.X2Property, Category_Appearance);
Metadata.AddCategory(Line.Y1Property, Category_Appearance);
Metadata.AddCategory(Line.Y2Property, Category_Appearance);
Metadata.AddCategory(LineGeometry.EndPointProperty, Category_Layout);
Metadata.AddCategory(LineGeometry.StartPointProperty, Category_Layout);
Metadata.AddCategory(MediaElement.BalanceProperty, Category_Media);
Metadata.AddCategory(MediaElement.IsMutedProperty, Category_Media);
Metadata.AddCategory(MediaElement.LoadedBehaviorProperty, Category_Media);
Metadata.AddCategory(MediaElement.ScrubbingEnabledProperty, Category_Media);
Metadata.AddCategory(MediaElement.SourceProperty, Category_Media);
Metadata.AddCategory(MediaElement.UnloadedBehaviorProperty, Category_Media);
Metadata.AddCategory(MediaElement.VolumeProperty, Category_Media);
Metadata.AddCategory(MenuItem.IconProperty, Category_Common_Properties);
Metadata.AddCategory(MenuItem.IsCheckableProperty, Category_Common_Properties);
Metadata.AddCategory(MenuItem.IsHighlightedProperty, Category_Common_Properties);
Metadata.AddCategory(MenuItem.IsPressedProperty, Category_Common_Properties);
Metadata.AddCategory(MenuItem.IsSubmenuOpenProperty, Category_Common_Properties);
Metadata.AddCategory(Model3D.TransformProperty, Category_Transform);
Metadata.AddCategory(OrthographicCamera.WidthProperty, Category_Camera);
Metadata.AddCategory(Page.TitleProperty, Category_Common_Properties);
Metadata.AddCategory(Panel.BackgroundProperty, Category_Brushes);
Metadata.AddCategory(Panel.IsItemsHostProperty, Category_Common_Properties);
Metadata.AddCategory(Panel.ZIndexProperty, Category_Layout);
Metadata.AddCategory(PasswordBox.PasswordCharProperty, Category_Text);
Metadata.AddCategory(Path.DataProperty, Category_Appearance);
Metadata.AddCategory(PathGeometry.FillRuleProperty, Category_Appearance);
Metadata.AddCategory(PathSegment.IsStrokedProperty, Category_Appearance);
Metadata.AddCategory(Pen.BrushProperty, Category_Appearance);
Metadata.AddCategory(Pen.DashCapProperty, Category_Appearance);
Metadata.AddCategory(Pen.DashStyleProperty, Category_Appearance);
Metadata.AddCategory(PerspectiveCamera.FieldOfViewProperty, Category_Camera);
Metadata.AddCategory(PointLightBase.ConstantAttenuationProperty, Category_Light);
Metadata.AddCategory(PointLightBase.LinearAttenuationProperty, Category_Light);
Metadata.AddCategory(PointLightBase.PositionProperty, Category_Light);
Metadata.AddCategory(PointLightBase.QuadraticAttenuationProperty, Category_Light);
Metadata.AddCategory(PointLightBase.RangeProperty, Category_Light);
Metadata.AddCategory(Polygon.FillRuleProperty, Category_Appearance);
Metadata.AddCategory(Polygon.PointsProperty, Category_Appearance);
Metadata.AddCategory(Polyline.FillRuleProperty, Category_Appearance);
Metadata.AddCategory(Polyline.PointsProperty, Category_Appearance);
Metadata.AddCategory(Popup.CustomPopupPlacementCallbackProperty, Category_Misc);
Metadata.AddCategory(Popup.HasDropShadowProperty, Category_Appearance);
Metadata.AddCategory(Popup.HorizontalOffsetProperty, Category_Layout);
Metadata.AddCategory(Popup.IsOpenProperty, Category_Common_Properties);
Metadata.AddCategory(Popup.PlacementProperty, Category_Layout);
Metadata.AddCategory(Popup.PlacementRectangleProperty, Category_Misc);
Metadata.AddCategory(Popup.PlacementTargetProperty, Category_Misc);
Metadata.AddCategory(Popup.StaysOpenProperty, Category_Common_Properties);
Metadata.AddCategory(Popup.VerticalOffsetProperty, Category_Layout);
Metadata.AddCategory(ProgressBar.IsIndeterminateProperty, Category_Common_Properties);
Metadata.AddCategory(ProgressBar.OrientationProperty, Category_Common_Properties);
Metadata.AddCategory(ProjectionCamera.FarPlaneDistanceProperty, Category_Camera);
Metadata.AddCategory(ProjectionCamera.LookDirectionProperty, Category_Camera);
Metadata.AddCategory(ProjectionCamera.NearPlaneDistanceProperty, Category_Camera);
Metadata.AddCategory(ProjectionCamera.PositionProperty, Category_Camera);
Metadata.AddCategory(ProjectionCamera.UpDirectionProperty, Category_Camera);
Metadata.AddCategory(RadialGradientBrush.CenterProperty, Category_Layout);
Metadata.AddCategory(RadioButton.GroupNameProperty, Category_Common_Properties);
Metadata.AddCategory(RangeBase.LargeChangeProperty, Category_Common_Properties);
Metadata.AddCategory(RangeBase.MaximumProperty, Category_Common_Properties);
Metadata.AddCategory(RangeBase.MinimumProperty, Category_Common_Properties);
Metadata.AddCategory(RangeBase.SmallChangeProperty, Category_Common_Properties);
Metadata.AddCategory(RangeBase.ValueProperty, Category_Common_Properties);
Metadata.AddCategory(Rectangle.RadiusXProperty, Category_Appearance);
Metadata.AddCategory(Rectangle.RadiusYProperty, Category_Appearance);
Metadata.AddCategory(RotateTransform.AngleProperty, Category_Transform);
Metadata.AddCategory(RotateTransform.CenterXProperty, Category_Transform);
Metadata.AddCategory(RotateTransform.CenterYProperty, Category_Transform);
Metadata.AddCategory(RowDefinition.HeightProperty, Category_Layout);
Metadata.AddCategory(RowDefinition.MaxHeightProperty, Category_Layout);
Metadata.AddCategory(RowDefinition.MinHeightProperty, Category_Layout);
Metadata.AddCategory(ScrollBar.OrientationProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.CanContentScrollProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ComputedHorizontalScrollBarVisibilityProperty, Category_Appearance);
Metadata.AddCategory(ScrollViewer.ComputedVerticalScrollBarVisibilityProperty, Category_Appearance);
Metadata.AddCategory(ScrollViewer.ExtentHeightProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ExtentWidthProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.HorizontalOffsetProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.HorizontalScrollBarVisibilityProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ScrollableHeightProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ScrollableWidthProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.VerticalOffsetProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.VerticalScrollBarVisibilityProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ViewportHeightProperty, Category_Layout);
Metadata.AddCategory(ScrollViewer.ViewportWidthProperty, Category_Layout);
Metadata.AddCategory(Selector.IsSynchronizedWithCurrentItemProperty, Category_Common_Properties);
Metadata.AddCategory(Selector.SelectedIndexProperty, Category_Common_Properties);
Metadata.AddCategory(Selector.SelectedItemProperty, Category_Common_Properties);
Metadata.AddCategory(Selector.SelectedValuePathProperty, Category_Common_Properties);
Metadata.AddCategory(Selector.SelectedValueProperty, Category_Common_Properties);
Metadata.AddCategory(Shape.FillProperty, Category_Brushes);
Metadata.AddCategory(Shape.StretchProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeDashArrayProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeDashCapProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeDashOffsetProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeEndLineCapProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeLineJoinProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeMiterLimitProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeProperty, Category_Brushes);
Metadata.AddCategory(Shape.StrokeStartLineCapProperty, Category_Appearance);
Metadata.AddCategory(Shape.StrokeThicknessProperty, Category_Appearance);
Metadata.AddCategory(SkewTransform.AngleXProperty, Category_Transform);
Metadata.AddCategory(SkewTransform.AngleYProperty, Category_Transform);
Metadata.AddCategory(SkewTransform.CenterXProperty, Category_Transform);
Metadata.AddCategory(SkewTransform.CenterYProperty, Category_Transform);
Metadata.AddCategory(Slider.AutoToolTipPlacementProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.AutoToolTipPrecisionProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.IsDirectionReversedProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.IsMoveToPointEnabledProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.IsSelectionRangeEnabledProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.IsSnapToTickEnabledProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.OrientationProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.SelectionEndProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.SelectionStartProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.TickFrequencyProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.TickPlacementProperty, Category_Common_Properties);
Metadata.AddCategory(Slider.TicksProperty, Category_Common_Properties);
Metadata.AddCategory(SolidColorBrush.ColorProperty, Category_Appearance);
Metadata.AddCategory(SpecularMaterial.BrushProperty, Category_Appearance);
Metadata.AddCategory(SpotLight.DirectionProperty, Category_Light);
Metadata.AddCategory(SpotLight.InnerConeAngleProperty, Category_Light);
Metadata.AddCategory(SpotLight.OuterConeAngleProperty, Category_Light);
Metadata.AddCategory(StackPanel.OrientationProperty, Category_Layout);
Metadata.AddCategory(StickyNoteControl.CaptionFontFamilyProperty, Category_Text);
Metadata.AddCategory(StickyNoteControl.CaptionFontSizeProperty, Category_Text);
Metadata.AddCategory(StickyNoteControl.CaptionFontStretchProperty, Category_Text);
Metadata.AddCategory(StickyNoteControl.CaptionFontStyleProperty, Category_Text);
Metadata.AddCategory(StickyNoteControl.CaptionFontWeightProperty, Category_Text);
Metadata.AddCategory(TabControl.ContentTemplateProperty, Category_Misc);
Metadata.AddCategory(TabControl.ContentTemplateSelectorProperty, Category_Misc);
Metadata.AddCategory(TabControl.SelectedContentTemplateProperty, Category_Misc);
Metadata.AddCategory(TabControl.SelectedContentTemplateSelectorProperty, Category_Misc);
Metadata.AddCategory(TabControl.TabStripPlacementProperty, Category_Common_Properties);
Metadata.AddCategory(Table.CellSpacingProperty, Category_Layout);
Metadata.AddCategory(TableCell.ColumnSpanProperty, Category_Layout);
Metadata.AddCategory(TableColumn.WidthProperty, Category_Layout);
Metadata.AddCategory(TextBlock.TextProperty, Category_Common_Properties);
Metadata.AddCategory(TextBlock.TextTrimmingProperty, Category_Text);
Metadata.AddCategory(TextBlock.TextWrappingProperty, Category_Text);
Metadata.AddCategory(TextBox.CharacterCasingProperty, Category_Text);
Metadata.AddCategory(TextBox.MaxLengthProperty, Category_Text);
Metadata.AddCategory(TextBox.MaxLinesProperty, Category_Text);
Metadata.AddCategory(TextBox.MinLinesProperty, Category_Text);
Metadata.AddCategory(TextBox.TextProperty, Category_Common_Properties);
Metadata.AddCategory(TextBoxBase.AcceptsTabProperty, Category_Text);
Metadata.AddCategory(TextBoxBase.AutoWordSelectionProperty, Category_Text);
Metadata.AddCategory(TextBoxBase.IsUndoEnabledProperty, Category_Text);
Metadata.AddCategory(TextEffect.ClipProperty, Category_Appearance);
Metadata.AddCategory(TextEffect.ForegroundProperty, Category_Appearance);
Metadata.AddCategory(TextElement.BackgroundProperty, Category_Brushes);
Metadata.AddCategory(TextElement.FontFamilyProperty, Category_Text);
Metadata.AddCategory(TextElement.FontSizeProperty, Category_Text);
Metadata.AddCategory(TextElement.FontStretchProperty, Category_Text);
Metadata.AddCategory(TextElement.FontStyleProperty, Category_Text);
Metadata.AddCategory(TextElement.FontWeightProperty, Category_Text);
Metadata.AddCategory(TextElement.ForegroundProperty, Category_Brushes);
Metadata.AddCategory(TextElement.TextEffectsProperty, Category_Text);
Metadata.AddCategory(TickBar.FillProperty, Category_Appearance);
Metadata.AddCategory(TileBrush.AlignmentXProperty, Category_Layout);
Metadata.AddCategory(TileBrush.AlignmentYProperty, Category_Layout);
Metadata.AddCategory(ToggleButton.IsCheckedProperty, Category_Common_Properties);
Metadata.AddCategory(ToggleButton.IsThreeStateProperty, Category_Common_Properties);
Metadata.AddCategory(TransformGroup.ChildrenProperty, Category_Transform);
Metadata.AddCategory(TranslateTransform.XProperty, Category_Layout);
Metadata.AddCategory(TranslateTransform.YProperty, Category_Layout);
Metadata.AddCategory(TreeViewItem.IsSelectedProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.BitmapEffectInputProperty, Category_Appearance);
Metadata.AddCategory(UIElement.BitmapEffectProperty, Category_Appearance);
Metadata.AddCategory(UIElement.ClipToBoundsProperty, Category_Appearance);
Metadata.AddCategory(UIElement.FocusableProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsEnabledProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsFocusedProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsHitTestVisibleProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsKeyboardFocusedProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsMouseOverProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.IsStylusDirectlyOverProperty, Category_Common_Properties);
Metadata.AddCategory(UIElement.OpacityMaskProperty, Category_Brushes);
Metadata.AddCategory(UIElement.OpacityProperty, Category_Appearance);
Metadata.AddCategory(UIElement.RenderTransformProperty, Category_Transform);
Metadata.AddCategory(UIElement.SnapsToDevicePixelsProperty, Category_Appearance);
Metadata.AddCategory(UIElement.VisibilityProperty, Category_Appearance);
Metadata.AddCategory(UniformGrid.ColumnsProperty, Category_Common_Properties);
Metadata.AddCategory(UniformGrid.RowsProperty, Category_Common_Properties);
Metadata.AddCategory(Viewbox.StretchDirectionProperty, Category_Appearance);
Metadata.AddCategory(Viewbox.StretchProperty, Category_Appearance);
Metadata.AddCategory(VirtualizingStackPanel.OrientationProperty, Category_Layout);
Metadata.AddCategory(Window.AllowsTransparencyProperty, Category_Appearance);
Metadata.AddCategory(Window.IconProperty, Category_Common_Properties);
Metadata.AddCategory(Window.ResizeModeProperty, Category_Common_Properties);
Metadata.AddCategory(Window.ShowInTaskbarProperty, Category_Common_Properties);
Metadata.AddCategory(Window.SizeToContentProperty, Category_Common_Properties);
Metadata.AddCategory(Window.TitleProperty, Category_Common_Properties);
Metadata.AddCategory(Window.TopmostProperty, Category_Common_Properties);
Metadata.AddCategory(Window.WindowStateProperty, Category_Common_Properties);
Metadata.AddCategory(Window.WindowStyleProperty, Category_Appearance);
Metadata.AddCategory(WrapPanel.ItemHeightProperty, Category_Layout);
Metadata.AddCategory(WrapPanel.ItemWidthProperty, Category_Layout);
Metadata.AddAdvancedProperty(Block.BreakColumnBeforeProperty); Metadata.AddPopularProperty(typeof(Binding), "Path");
Metadata.AddAdvancedProperty(Block.BreakPageBeforeProperty); Metadata.AddPopularProperty(typeof(Binding), "Source");
Metadata.AddAdvancedProperty(Block.PaddingProperty); Metadata.AddPopularProperty(typeof(Binding), "Mode");
Metadata.AddAdvancedProperty(ColumnDefinition.MaxWidthProperty); Metadata.AddPopularProperty(typeof(Binding), "RelativeSource");
Metadata.AddAdvancedProperty(ColumnDefinition.MinWidthProperty); Metadata.AddPopularProperty(typeof(Binding), "ElementName");
Metadata.AddAdvancedProperty(ComboBox.StaysOpenOnEditProperty); Metadata.AddPopularProperty(typeof(Binding), "Converter");
Metadata.AddAdvancedProperty(ComboBox.TextProperty); Metadata.AddPopularProperty(typeof(Binding), "XPath");
Metadata.AddAdvancedProperty(Control.HorizontalContentAlignmentProperty);
Metadata.AddAdvancedProperty(Control.PaddingProperty);
Metadata.AddAdvancedProperty(Control.VerticalContentAlignmentProperty);
Metadata.AddAdvancedProperty(DashStyle.DashesProperty);
Metadata.AddAdvancedProperty(DocumentViewer.ExtentHeightProperty);
Metadata.AddAdvancedProperty(DocumentViewer.ExtentWidthProperty);
Metadata.AddAdvancedProperty(DocumentViewer.HorizontalOffsetProperty);
Metadata.AddAdvancedProperty(DocumentViewer.HorizontalPageSpacingProperty);
Metadata.AddAdvancedProperty(DocumentViewer.ViewportHeightProperty);
Metadata.AddAdvancedProperty(DocumentViewer.ViewportWidthProperty);
Metadata.AddAdvancedProperty(DrawingGroup.ClipGeometryProperty);
Metadata.AddAdvancedProperty(Figure.CanDelayPlacementProperty);
Metadata.AddAdvancedProperty(Figure.HorizontalAnchorProperty);
Metadata.AddAdvancedProperty(Figure.HorizontalOffsetProperty);
Metadata.AddAdvancedProperty(Figure.VerticalAnchorProperty);
Metadata.AddAdvancedProperty(Figure.VerticalOffsetProperty);
Metadata.AddAdvancedProperty(FlowDocument.ColumnGapProperty);
Metadata.AddAdvancedProperty(FlowDocument.ColumnRuleBrushProperty);
Metadata.AddAdvancedProperty(FlowDocument.ColumnRuleWidthProperty);
Metadata.AddAdvancedProperty(FlowDocument.ColumnWidthProperty);
Metadata.AddAdvancedProperty(FlowDocument.IsColumnWidthFlexibleProperty);
Metadata.AddAdvancedProperty(FormatConvertedBitmap.AlphaThresholdProperty);
Metadata.AddAdvancedProperty(FrameworkElement.ActualHeightProperty);
Metadata.AddAdvancedProperty(FrameworkElement.ActualWidthProperty);
Metadata.AddAdvancedProperty(FrameworkElement.LayoutTransformProperty);
Metadata.AddAdvancedProperty(FrameworkElement.MaxHeightProperty);
Metadata.AddAdvancedProperty(FrameworkElement.MaxWidthProperty);
Metadata.AddAdvancedProperty(FrameworkElement.MinHeightProperty);
Metadata.AddAdvancedProperty(FrameworkElement.MinWidthProperty);
Metadata.AddAdvancedProperty(FrameworkElement.TagProperty);
Metadata.AddAdvancedProperty(GeometryGroup.FillRuleProperty);
Metadata.AddAdvancedProperty(Glyphs.FontRenderingEmSizeProperty);
Metadata.AddAdvancedProperty(Glyphs.FontUriProperty);
Metadata.AddAdvancedProperty(Grid.IsSharedSizeScopeProperty);
Metadata.AddAdvancedProperty(Grid.ShowGridLinesProperty);
Metadata.AddAdvancedProperty(ItemsControl.DisplayMemberPathProperty);
Metadata.AddAdvancedProperty(ItemsControl.IsTextSearchEnabledProperty);
Metadata.AddAdvancedProperty(MediaElement.LoadedBehaviorProperty);
Metadata.AddAdvancedProperty(MediaElement.ScrubbingEnabledProperty);
Metadata.AddAdvancedProperty(MediaElement.UnloadedBehaviorProperty);
Metadata.AddAdvancedProperty(PasswordBox.PasswordCharProperty);
Metadata.AddAdvancedProperty(PathGeometry.FillRuleProperty);
Metadata.AddAdvancedProperty(PathSegment.IsStrokedProperty);
Metadata.AddAdvancedProperty(Pen.DashCapProperty);
Metadata.AddAdvancedProperty(Pen.DashStyleProperty);
Metadata.AddAdvancedProperty(RowDefinition.MaxHeightProperty);
Metadata.AddAdvancedProperty(RowDefinition.MinHeightProperty);
Metadata.AddAdvancedProperty(ScrollViewer.CanContentScrollProperty);
Metadata.AddAdvancedProperty(ScrollViewer.CanContentScrollProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ComputedHorizontalScrollBarVisibilityProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ComputedVerticalScrollBarVisibilityProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ExtentHeightProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ExtentWidthProperty);
Metadata.AddAdvancedProperty(ScrollViewer.HorizontalOffsetProperty);
Metadata.AddAdvancedProperty(ScrollViewer.HorizontalScrollBarVisibilityProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ScrollableHeightProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ScrollableWidthProperty);
Metadata.AddAdvancedProperty(ScrollViewer.VerticalOffsetProperty);
Metadata.AddAdvancedProperty(ScrollViewer.VerticalScrollBarVisibilityProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ViewportHeightProperty);
Metadata.AddAdvancedProperty(ScrollViewer.ViewportWidthProperty);
Metadata.AddAdvancedProperty(Selector.SelectedItemProperty);
Metadata.AddAdvancedProperty(Selector.SelectedValuePathProperty);
Metadata.AddAdvancedProperty(Selector.SelectedValueProperty);
Metadata.AddAdvancedProperty(Shape.StretchProperty);
Metadata.AddAdvancedProperty(Shape.StrokeDashArrayProperty);
Metadata.AddAdvancedProperty(Shape.StrokeDashCapProperty);
Metadata.AddAdvancedProperty(Shape.StrokeDashOffsetProperty);
Metadata.AddAdvancedProperty(Shape.StrokeEndLineCapProperty);
Metadata.AddAdvancedProperty(Shape.StrokeLineJoinProperty);
Metadata.AddAdvancedProperty(Shape.StrokeMiterLimitProperty);
Metadata.AddAdvancedProperty(Shape.StrokeStartLineCapProperty);
Metadata.AddAdvancedProperty(SkewTransform.CenterXProperty);
Metadata.AddAdvancedProperty(SkewTransform.CenterYProperty);
Metadata.AddAdvancedProperty(Slider.AutoToolTipPrecisionProperty);
Metadata.AddAdvancedProperty(Slider.IsMoveToPointEnabledProperty);
Metadata.AddAdvancedProperty(Slider.IsSelectionRangeEnabledProperty);
Metadata.AddAdvancedProperty(Slider.IsSnapToTickEnabledProperty);
Metadata.AddAdvancedProperty(Slider.SelectionEndProperty);
Metadata.AddAdvancedProperty(Slider.SelectionStartProperty);
Metadata.AddAdvancedProperty(Slider.TicksProperty);
Metadata.AddAdvancedProperty(TextBlock.TextTrimmingProperty);
Metadata.AddAdvancedProperty(TextBlock.TextWrappingProperty);
Metadata.AddAdvancedProperty(TextBox.CharacterCasingProperty);
Metadata.AddAdvancedProperty(TextBox.MaxLengthProperty);
Metadata.AddAdvancedProperty(TextBox.MaxLinesProperty);
Metadata.AddAdvancedProperty(TextBox.MinLinesProperty);
Metadata.AddAdvancedProperty(TextBoxBase.AcceptsTabProperty);
Metadata.AddAdvancedProperty(TextBoxBase.AutoWordSelectionProperty);
Metadata.AddAdvancedProperty(TextBoxBase.IsUndoEnabledProperty);
Metadata.AddAdvancedProperty(TextEffect.ClipProperty);
Metadata.AddAdvancedProperty(TextElement.FontStretchProperty);
Metadata.AddAdvancedProperty(TextElement.FontStyleProperty);
Metadata.AddAdvancedProperty(TextElement.FontWeightProperty);
Metadata.AddAdvancedProperty(TextElement.TextEffectsProperty);
Metadata.AddAdvancedProperty(UIElement.BitmapEffectInputProperty);
Metadata.AddAdvancedProperty(UIElement.BitmapEffectProperty);
Metadata.AddAdvancedProperty(UIElement.ClipToBoundsProperty);
Metadata.AddAdvancedProperty(UIElement.FocusableProperty);
Metadata.AddAdvancedProperty(UIElement.IsHitTestVisibleProperty);
Metadata.AddAdvancedProperty(UIElement.SnapsToDevicePixelsProperty);
Metadata.AddValueRange(Block.LineHeightProperty, double.Epsilon, double.MaxValue); Metadata.AddValueRange(Block.LineHeightProperty, double.Epsilon, double.MaxValue);
Metadata.AddValueRange(Canvas.BottomProperty, double.MinValue, double.MaxValue); Metadata.AddValueRange(Canvas.BottomProperty, double.MinValue, double.MaxValue);
@ -542,26 +182,12 @@ namespace ICSharpCode.WpfDesign.Designer
Metadata.AddValueRange(Timeline.DecelerationRatioProperty, 0, 1); Metadata.AddValueRange(Timeline.DecelerationRatioProperty, 0, 1);
Metadata.AddValueRange(Timeline.AccelerationRatioProperty, 0, 1); Metadata.AddValueRange(Timeline.AccelerationRatioProperty, 0, 1);
Metadata.AddValueRange(Track.ViewportSizeProperty, 0, double.PositiveInfinity); Metadata.AddValueRange(Track.ViewportSizeProperty, 0, double.PositiveInfinity);
Metadata.AddValueRange(UIElement.OpacityProperty, 0, 1); Metadata.AddValueRange(UIElement.OpacityProperty, 0, 1);
Metadata.AddAdvancedProperty(typeof(Binding), "ValidationRules"); Metadata.HideProperty(typeof(UIElement), "RenderSize");
Metadata.AddAdvancedProperty(typeof(Binding), "ValidatesOnExceptions"); Metadata.HideProperty(FrameworkElement.NameProperty);
Metadata.AddAdvancedProperty(typeof(Binding), "ValidatesOnDataErrors"); Metadata.HideProperty(typeof(FrameworkElement), "Resources");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnSourceUpdated"); Metadata.HideProperty(typeof(Window), "Owner");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnTargetUpdated");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnValidationError");
Metadata.AddAdvancedProperty(typeof(Binding), "ConverterParameter");
Metadata.AddAdvancedProperty(typeof(Binding), "ConverterCulture");
Metadata.AddAdvancedProperty(typeof(Binding), "Source");
Metadata.AddAdvancedProperty(typeof(Binding), "RelativeSource");
Metadata.AddAdvancedProperty(typeof(Binding), "IsAsync");
Metadata.AddAdvancedProperty(typeof(Binding), "AsyncState");
Metadata.AddAdvancedProperty(typeof(Binding), "BindsDirectlyToSource");
Metadata.AddAdvancedProperty(typeof(Binding), "UpdateSourceExceptionFilter");
Metadata.AddAdvancedProperty(typeof(BindingBase), "FallbackValue");
Metadata.AddAdvancedProperty(typeof(BindingBase), "StringFormat");
Metadata.AddAdvancedProperty(typeof(BindingBase), "TargetNullValue");
//Metadata.DisablePlacement(typeof(Button)); //Metadata.DisablePlacement(typeof(Button));
} }

1
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/NumericUpDown.xaml

@ -125,6 +125,7 @@
<TextBox x:Name="PART_TextBox" <TextBox x:Name="PART_TextBox"
BorderThickness="0" BorderThickness="0"
Background="{x:Null}" Background="{x:Null}"
Foreground="{TemplateBinding Foreground}"
Grid.RowSpan="2" /> Grid.RowSpan="2" />
<Controls:DragRepeatButton x:Name="PART_UpButton" <Controls:DragRepeatButton x:Name="PART_UpButton"
Style="{StaticResource UpButton}" Style="{StaticResource UpButton}"

16
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Converters.cs

@ -116,4 +116,20 @@ namespace ICSharpCode.WpfDesign.Designer.Converters
throw new NotImplementedException(); throw new NotImplementedException();
} }
} }
// Boxed int throw exception without converter (wpf bug?)
public class DummyConverter : IValueConverter
{
public static DummyConverter Instance = new DummyConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
} }

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ExtensionMethods.cs

@ -51,6 +51,6 @@ namespace ICSharpCode.WpfDesign.Designer
if (result != null) return result; if (result != null) return result;
} }
return null; return null;
} }
} }
} }

1
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/SnaplinePlacementBehavior.cs

@ -67,7 +67,6 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var horizontalInput = new List<Snapline>(); var horizontalInput = new List<Snapline>();
var verticalInput = new List<Snapline>(); var verticalInput = new List<Snapline>();
var info = operation.PlacedItems[0]; var info = operation.PlacedItems[0];
var snapping = !Keyboard.IsKeyDown(Key.LeftCtrl);
if (operation.Type == PlacementType.Resize) { if (operation.Type == PlacementType.Resize) {
AddLines(bounds, 0, false, horizontalInput, verticalInput, info.ResizeThumbAlignment); AddLines(bounds, 0, false, horizontalInput, verticalInput, info.ResizeThumbAlignment);

17
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/NumberEditor.xaml

@ -1,10 +1,9 @@
<Controls:NumericUpDown <Controls:NumericUpDown x:Class="ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.NumberEditor"
x:Class="ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.NumberEditor" xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls"
xmlns:Controls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls" xmlns:Converters="clr-namespace:ICSharpCode.WpfDesign.Designer.Converters"
BorderThickness="0" BorderThickness="0"
Background="{x:Null}" Background="{x:Null}"
Value="{Binding Value}" Value="{Binding Value, Converter={x:Static Converters:DummyConverter.Instance}}">
>
</Controls:NumericUpDown> </Controls:NumericUpDown>

173
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs

@ -8,43 +8,31 @@ using System.Threading;
using System.Globalization; using System.Globalization;
using ICSharpCode.WpfDesign.PropertyGrid; using ICSharpCode.WpfDesign.PropertyGrid;
using System.Windows.Threading; using System.Windows.Threading;
using System.Diagnostics;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{ {
public enum PropertyGridTab
{
Properties,
Events
}
public class PropertyGrid : INotifyPropertyChanged public class PropertyGrid : INotifyPropertyChanged
{ {
public PropertyGrid() public PropertyGrid()
{ {
Categories = new ObservableCollection<Category>(); Categories = new ObservableCollection<Category>(new [] {
Events = new ObservableCollection<PropertyNode>(); specialCategory,
popularCategory,
otherCategory
});
Events = new PropertyNodeCollection();
} }
static SortedDictionary<string, Category> allCategories = Category specialCategory = new Category("Special");
new SortedDictionary<string, Category>(CategoryNameComparer.Instance); Category popularCategory = new Category("Popular");
Category otherCategory = new Category("Other");
class CategoryNameComparer : IComparer<string> Dictionary<MemberDescriptor, PropertyNode> nodeFromDescriptor = new Dictionary<MemberDescriptor, PropertyNode>();
{
public static CategoryNameComparer Instance = new CategoryNameComparer();
public int Compare(string x, string y)
{
int i1 = Array.IndexOf(Metadata.CategoryOrder, x);
if (i1 == -1) i1 = int.MaxValue;
int i2 = Array.IndexOf(Metadata.CategoryOrder, y);
if (i2 == -1) i2 = int.MaxValue;
if (i1 == i2) return x.CompareTo(y);
return i1.CompareTo(i2);
}
}
public ObservableCollection<Category> Categories { get; private set; } public ObservableCollection<Category> Categories { get; private set; }
public ObservableCollection<PropertyNode> Events { get; private set; } public PropertyNodeCollection Events { get; private set; }
PropertyGridTab currentTab; PropertyGridTab currentTab;
@ -90,7 +78,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
return selectedItems; return selectedItems;
} }
set { set {
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(delegate { Dispatcher.CurrentDispatcher.BeginInvoke(new Action(delegate {
selectedItems = value; selectedItems = value;
Reload(); Reload();
RaisePropertyChanged("SelectedItems"); RaisePropertyChanged("SelectedItems");
@ -105,75 +93,51 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
void Reload() void Reload()
{ {
Categories.Clear(); Clear();
Events.Clear();
SingleItem = null; if (SelectedItems == null || SelectedItems.Count() == 0) return;
if (SelectedItems.Count() == 1) SingleItem = SelectedItems.First();
foreach (var md in GetDescriptors()) {
if (PassesFilter(md.Name))
AddNode(md);
}
}
foreach (var cat in allCategories.Values) { void Clear()
cat.Properties.Clear(); {
cat.MoreProperties.Clear(); foreach (var c in Categories) {
c.IsVisible = false;
foreach (var p in c.Properties) {
p.IsVisible = false;
}
} }
if (SelectedItems == null || SelectedItems.Count() == 0) return; foreach (var e in Events) {
e.IsVisible = false;
}
SingleItem = null;
}
List<MemberDescriptor> GetDescriptors()
{
List<MemberDescriptor> list = new List<MemberDescriptor>(); List<MemberDescriptor> list = new List<MemberDescriptor>();
if (SelectedItems.Count() == 1) { if (SelectedItems.Count() == 1) {
SingleItem = SelectedItems.First();
foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.ComponentType)) { foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.ComponentType)) {
list.Add(d); list.Add(d);
} }
foreach (MemberDescriptor d in TypeHelper.GetAvailableEvents(SingleItem.ComponentType)) { foreach (MemberDescriptor d in TypeHelper.GetAvailableEvents(SingleItem.ComponentType)) {
list.Add(d); list.Add(d);
} }
} } else {
else {
foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.ComponentType))) { foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.ComponentType))) {
list.Add(d); list.Add(d);
} }
} }
var nodeList = list return list;
.Where(d => PassesFilter(d.Name))
.OrderBy(d => d.Name)
.Select(d => new PropertyNode(SelectedItems.Select(t => t.Properties[d.Name]).ToArray()));
foreach (var node in nodeList) {
if (node.IsEvent) {
Events.Add(node);
}
else {
string catName = Metadata.GetCategory(node.FirstProperty) ?? BasicMetadata.Category_Misc;
Category cat;
if (!allCategories.TryGetValue(catName, out cat)) {
cat = new Category(catName);
allCategories[catName] = cat;
}
if (Metadata.IsAdvanced(node.FirstProperty)) {
cat.MoreProperties.Add(node);
}
else {
cat.Properties.Add(node);
}
}
}
foreach (var cat in allCategories.Values) {
if (cat.Properties.Count > 0 || cat.MoreProperties.Count > 0) {
if (string.IsNullOrEmpty(Filter)) {
if (cat.ShowMoreByFilter) {
cat.ShowMore = false;
cat.ShowMoreByFilter = false;
}
}
else {
cat.ShowMore = true;
cat.ShowMoreByFilter = true;
}
Categories.Add(cat);
}
}
} }
bool PassesFilter(string name) bool PassesFilter(string name)
@ -189,6 +153,40 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
return false; return false;
} }
void AddNode(MemberDescriptor md)
{
var designProperties = SelectedItems.Select(item => item.Properties[md.Name]).ToArray();
if (!Metadata.IsBrowsable(designProperties[0])) return;
PropertyNode node;
if (nodeFromDescriptor.TryGetValue(md, out node)) {
node.Load(designProperties);
} else {
node = new PropertyNode();
node.Load(designProperties);
if (node.IsEvent) {
Events.AddSorted(node);
} else {
var cat = PickCategory(node);
cat.Properties.AddSorted(node);
node.Category = cat;
}
nodeFromDescriptor[md] = node;
}
node.IsVisible = true;
if (node.Category != null)
node.Category.IsVisible = true;
}
Category PickCategory(PropertyNode node)
{
if (Metadata.IsPopular(node.FirstProperty)) return popularCategory;
var typeName = node.FirstProperty.DeclaringType.FullName;
if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls."))
return otherCategory;
return specialCategory;
}
#region INotifyPropertyChanged Members #region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
@ -201,5 +199,26 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
} }
#endregion #endregion
//class CategoryNameComparer : IComparer<string>
//{
// public static CategoryNameComparer Instance = new CategoryNameComparer();
// public int Compare(string x, string y)
// {
// int i1 = Array.IndexOf(Metadata.CategoryOrder, x);
// if (i1 == -1) i1 = int.MaxValue;
// int i2 = Array.IndexOf(Metadata.CategoryOrder, y);
// if (i2 == -1) i2 = int.MaxValue;
// if (i1 == i2) return x.CompareTo(y);
// return i1.CompareTo(i2);
// }
//}
}
public enum PropertyGridTab
{
Properties,
Events
} }
} }

31
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml

@ -165,11 +165,13 @@
</Setter> </Setter>
</Style> </Style>
<DataTemplate DataType="{x:Type PropertyGrid:Category}"> <DataTemplate DataType="{x:Type PropertyGridBase:Category}">
<Expander Header="{Binding Name}" <Expander Header="{Binding Name}"
Style="{StaticResource CategoryExpanderStyle}" Style="{StaticResource CategoryExpanderStyle}"
IsExpanded="{Binding IsExpanded}"> IsExpanded="{Binding IsExpanded}"
<StackPanel> Visibility="{Binding IsVisible, Converter={x:Static Converters:CollapsedWhenFalse.Instance}}">
<ItemsControl ItemsSource="{Binding Properties}" />
<!--<StackPanel>
<ItemsControl ItemsSource="{Binding Properties}" /> <ItemsControl ItemsSource="{Binding Properties}" />
<Expander Visibility="{Binding MoreProperties.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}" <Expander Visibility="{Binding MoreProperties.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}"
Style="{StaticResource MoreExpanderStyle}" Style="{StaticResource MoreExpanderStyle}"
@ -177,12 +179,12 @@
<ItemsControl ItemsSource="{Binding MoreProperties}" <ItemsControl ItemsSource="{Binding MoreProperties}"
Background="#F9F9F4" /> Background="#F9F9F4" />
</Expander> </Expander>
</StackPanel> </StackPanel>-->
</Expander> </Expander>
</DataTemplate> </DataTemplate>
<DataTemplate DataType="{x:Type PropertyGridBase:PropertyNode}"> <DataTemplate DataType="{x:Type PropertyGridBase:PropertyNode}">
<StackPanel> <StackPanel Visibility="{Binding IsVisible, Converter={x:Static Converters:CollapsedWhenFalse.Instance}}">
<Border x:Name="uxPropertyNodeRow" <Border x:Name="uxPropertyNodeRow"
MinHeight="20" MinHeight="20"
BorderThickness="0 0 0 1" BorderThickness="0 0 0 1"
@ -202,11 +204,13 @@
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="7 0 0 0" Margin="7 0 0 0"
ToolTip="{Binding Description}" ToolTip="{Binding Description}"
FontWeight="{Binding FontWeight}" /> FontWeight="{Binding FontWeight}"
Foreground="{Binding NameForeground}" />
</DockPanel> </DockPanel>
<Border BorderThickness="1 0 0 0" <Border BorderThickness="1 0 0 0"
BorderBrush="{x:Static SystemColors.ControlBrush}"> BorderBrush="{x:Static SystemColors.ControlBrush}">
<ContentPresenter Content="{Binding Editor}" <ContentPresenter x:Name="editorConatiner"
Content="{Binding Editor}"
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="3 0" /> Margin="3 0" />
</Border> </Border>
@ -218,10 +222,21 @@
<Expander Visibility="{Binding MoreChildren.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}" <Expander Visibility="{Binding MoreChildren.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}"
Style="{StaticResource MoreExpanderStyle}"> Style="{StaticResource MoreExpanderStyle}">
<ItemsControl ItemsSource="{Binding MoreChildren}" <ItemsControl ItemsSource="{Binding MoreChildren}"
Background="#F9F9F4" /> Background="#F9F9F4"/>
</Expander> </Expander>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsEnabled}"
Value="False">
<Setter TargetName="editorConatiner"
Property="Opacity"
Value="0.5" />
<Setter TargetName="editorConatiner"
Property="IsHitTestVisible"
Value="False" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate> </DataTemplate>
<!--<DataTemplate DataType="{x:Type FontFamily}"> <!--<DataTemplate DataType="{x:Type FontFamily}">

1
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj

@ -113,7 +113,6 @@
<Compile Include="Extensions\ResizeThumbExtension.cs" /> <Compile Include="Extensions\ResizeThumbExtension.cs" />
<Compile Include="Extensions\WindowResizeBehavior.cs" /> <Compile Include="Extensions\WindowResizeBehavior.cs" />
<Compile Include="BasicMetadata.cs" /> <Compile Include="BasicMetadata.cs" />
<Compile Include="PropertyGrid\Category.cs" />
<Compile Include="PropertyGrid\Editors\BoolEditor.xaml.cs"> <Compile Include="PropertyGrid\Editors\BoolEditor.xaml.cs">
<DependentUpon>BoolEditor.xaml</DependentUpon> <DependentUpon>BoolEditor.xaml</DependentUpon>
</Compile> </Compile>

14
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs

@ -94,8 +94,9 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
public override DesignItem Value { public override DesignItem Value {
get { get {
if (IsCollection) // Binding...
throw new DesignerException("Cannot access Value for collection properties."); //if (IsCollection)
// throw new DesignerException("Cannot access Value for collection properties.");
var xamlObject = _property.PropertyValue as XamlObject; var xamlObject = _property.PropertyValue as XamlObject;
if (xamlObject != null) { if (xamlObject != null) {
@ -129,6 +130,11 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
_property.ValueChanged -= value; _property.ValueChanged -= value;
} }
} }
public override event EventHandler ValueOnInstanceChanged {
add { _property.ValueOnIstanceChanged += value; }
remove { _property.ValueOnIstanceChanged -= value; }
}
public override object ValueOnInstance { public override object ValueOnInstance {
get { get {
@ -138,7 +144,9 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
} }
public override bool IsSet { public override bool IsSet {
get { return _property.IsSet; } get { if (_property.IsSet) {
}
return _property.IsSet; }
} }
#if EventHandlerDebugging #if EventHandlerDebugging

23
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs

@ -138,7 +138,9 @@ namespace ICSharpCode.WpfDesign.XamlDom
/// Gets if the property is set. /// Gets if the property is set.
/// </summary> /// </summary>
public bool IsSet { public bool IsSet {
get { return propertyValue != null || collectionElements != null; } get { return propertyValue != null ||
_propertyElement != null; // collection
}
} }
/// <summary> /// <summary>
@ -151,17 +153,27 @@ namespace ICSharpCode.WpfDesign.XamlDom
/// </summary> /// </summary>
public event EventHandler ValueChanged; public event EventHandler ValueChanged;
//When ME evaluated PropertyValue dosn't changed but ValueOnIstance does.
public event EventHandler ValueOnIstanceChanged;
void SetPropertyValue(XamlPropertyValue value) void SetPropertyValue(XamlPropertyValue value)
{ {
if (IsCollection) { // Binding...
throw new InvalidOperationException("Cannot set the value of collection properties."); //if (IsCollection) {
} // throw new InvalidOperationException("Cannot set the value of collection properties.");
//}
bool wasSet = this.IsSet; bool wasSet = this.IsSet;
PossiblyNameChanged(propertyValue, value); PossiblyNameChanged(propertyValue, value);
//reset expression
var xamlObject = propertyValue as XamlObject;
if (xamlObject != null && xamlObject.IsMarkupExtension)
propertyInfo.ResetValue(parentObject.Instance);
ResetInternal(); ResetInternal();
propertyValue = value; propertyValue = value;
propertyValue.ParentProperty = this; propertyValue.ParentProperty = this;
propertyValue.AddNodeTo(this); propertyValue.AddNodeTo(this);
@ -174,6 +186,7 @@ namespace ICSharpCode.WpfDesign.XamlDom
IsSetChanged(this, EventArgs.Empty); IsSetChanged(this, EventArgs.Empty);
} }
} }
if (ValueChanged != null) { if (ValueChanged != null) {
ValueChanged(this, EventArgs.Empty); ValueChanged(this, EventArgs.Empty);
} }
@ -358,6 +371,8 @@ namespace ICSharpCode.WpfDesign.XamlDom
} }
set { set {
propertyInfo.SetValue(parentObject.Instance, value); propertyInfo.SetValue(parentObject.Instance, value);
if (ValueOnIstanceChanged != null)
ValueOnIstanceChanged(this, EventArgs.Empty);
} }
} }

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/DesignItemProperty.cs

@ -74,6 +74,8 @@ namespace ICSharpCode.WpfDesign
/// Is raised when the value of the property changes (by calling <see cref="SetValue"/> or <see cref="Reset"/>). /// Is raised when the value of the property changes (by calling <see cref="SetValue"/> or <see cref="Reset"/>).
/// </summary> /// </summary>
public abstract event EventHandler ValueChanged; public abstract event EventHandler ValueChanged;
public abstract event EventHandler ValueOnInstanceChanged;
/// <summary> /// <summary>
/// Gets/Sets the value of the property on the designed instance. /// Gets/Sets the value of the property on the designed instance.

124
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs

@ -53,61 +53,113 @@ namespace ICSharpCode.WpfDesign
return null; return null;
} }
static Dictionary<string, string> categories = new Dictionary<string, string>(); //static Dictionary<string, string> categories = new Dictionary<string, string>();
public static void AddCategory(DependencyProperty p, string category) //public static void AddCategory(DependencyProperty p, string category)
//{
// lock (categories) {
// categories[p.GetFullName()] = category;
// }
//}
//public static void AddCategory(Type type, string property, string category)
//{
// lock (categories) {
// categories[type + "." + property] = category;
// }
//}
//public static string GetCategory(DesignItemProperty p)
//{
// string result;
// lock (categories) {
// if (categories.TryGetValue(p.DependencyFullName, out result)) {
// return result;
// }
// }
// return p.Category;
//}
//static HashSet<string> advancedProperties = new HashSet<string>();
//public static void AddAdvancedProperty(DependencyProperty p)
//{
// lock (advancedProperties) {
// advancedProperties.Add(p.GetFullName());
// }
//}
//public static void AddAdvancedProperty(Type type, string member)
//{
// lock (advancedProperties) {
// advancedProperties.Add(type.FullName + "." + member);
// }
//}
//public static bool IsAdvanced(DesignItemProperty p)
//{
// lock (advancedProperties) {
// if (advancedProperties.Contains(p.DependencyFullName)) {
// return true;
// }
// }
// return p.IsAdvanced;
//}
static HashSet<string> hiddenProperties = new HashSet<string>();
public static void HideProperty(DependencyProperty p)
{ {
lock (categories) { lock (hiddenProperties) {
categories[p.GetFullName()] = category; hiddenProperties.Add(p.GetFullName());
} }
} }
public static void AddCategory(Type type, string property, string category) public static void HideProperty(Type type, string member)
{ {
lock (categories) { lock (hiddenProperties) {
categories[type + "." + property] = category; hiddenProperties.Add(type.FullName + "." + member);
} }
} }
public static string GetCategory(DesignItemProperty p) public static bool IsBrowsable(DesignItemProperty p)
{ {
string result; lock (hiddenProperties) {
lock (categories) { if (hiddenProperties.Contains(p.DependencyFullName)) {
if (categories.TryGetValue(p.DependencyFullName, out result)) { return false;
return result; }
} }
} return true;
return p.Category;
} }
static HashSet<string> advancedProperties = new HashSet<string>(); //public static string[] CategoryOrder { get; set; }
static HashSet<string> popularProperties = new HashSet<string>();
public static void AddAdvancedProperty(DependencyProperty p) public static void AddPopularProperty(DependencyProperty p)
{ {
lock (advancedProperties) { lock (popularProperties) {
advancedProperties.Add(p.GetFullName()); popularProperties.Add(p.GetFullName());
} }
} }
public static void AddAdvancedProperty(Type type, string member) public static void AddPopularProperty(Type type, string member)
{ {
lock (advancedProperties) { lock (popularProperties) {
advancedProperties.Add(type.FullName + "." + member); popularProperties.Add(type.FullName + "." + member);
} }
} }
public static bool IsAdvanced(DesignItemProperty p) public static bool IsPopular(DesignItemProperty p)
{ {
lock (advancedProperties) { lock (popularProperties) {
if (advancedProperties.Contains(p.DependencyFullName)) { if (popularProperties.Contains(p.DependencyFullName)) {
return true; return true;
} }
} }
return p.IsAdvanced; return false;
} }
public static string[] CategoryOrder { get; set; }
static Dictionary<string, NumberRange> ranges = new Dictionary<string, NumberRange>(); static Dictionary<string, NumberRange> ranges = new Dictionary<string, NumberRange>();
public static void AddValueRange(DependencyProperty p, double min, double max) public static void AddValueRange(DependencyProperty p, double min, double max)

41
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Category.cs → src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/Category.cs

@ -6,20 +6,20 @@ using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using ICSharpCode.WpfDesign.PropertyGrid; using ICSharpCode.WpfDesign.PropertyGrid;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid namespace ICSharpCode.WpfDesign.PropertyGrid
{ {
public class Category : INotifyPropertyChanged public class Category : INotifyPropertyChanged
{ {
public Category(string name) public Category(string name)
{ {
Name = name; Name = name;
Properties = new ObservableCollection<PropertyNode>(); Properties = new PropertyNodeCollection();
MoreProperties = new ObservableCollection<PropertyNode>(); //MoreProperties = new ObservableCollection<PropertyNode>();
} }
public string Name { get; private set; } public string Name { get; private set; }
public ObservableCollection<PropertyNode> Properties { get; private set; } public PropertyNodeCollection Properties { get; private set; }
public ObservableCollection<PropertyNode> MoreProperties { get; private set; } //public ObservableCollection<PropertyNode> MoreProperties { get; private set; }
bool isExpanded = true; bool isExpanded = true;
@ -33,16 +33,31 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
} }
} }
bool showMore; //bool showMore;
internal bool ShowMoreByFilter; //internal bool ShowMoreByFilter;
public bool ShowMore { //public bool ShowMore {
get { // get {
return showMore; // return showMore;
// }
// set {
// showMore = value;
// RaisePropertyChanged("ShowMore");
// }
//}
bool isVisible;
public bool IsVisible
{
get
{
return isVisible;
} }
set { set
showMore = value; {
RaisePropertyChanged("ShowMore"); isVisible = value;
RaisePropertyChanged("IsVisible");
} }
} }

172
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

@ -7,43 +7,18 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.PropertyGrid namespace ICSharpCode.WpfDesign.PropertyGrid
{ {
public class PropertyNode : INotifyPropertyChanged public class PropertyNode : INotifyPropertyChanged
{ {
public PropertyNode(DesignItemProperty[] properties)
: this(properties, null)
{
}
PropertyNode(DesignItemProperty[] properties, PropertyNode parent)
{
this.Properties = properties;
this.Parent = parent;
this.Level = parent == null ? 0 : parent.Level + 1;
foreach (var property in properties) {
property.ValueChanged += new EventHandler(property_ValueChanged);
}
Editor = EditorManager.CreateEditor(FirstProperty);
Children = new ObservableCollection<PropertyNode>();
MoreChildren = new ObservableCollection<PropertyNode>();
UpdateChildren();
}
void property_ValueChanged(object sender, EventArgs e)
{
if (raiseEvents) {
OnValueChanged();
}
}
static object Unset = new object(); static object Unset = new object();
public DesignItemProperty[] Properties { get; private set; } public DesignItemProperty[] Properties { get; private set; }
bool raiseEvents = true; bool raiseEvents = true;
bool hasStringConverter;
public string Name { get { return FirstProperty.Name; } } public string Name { get { return FirstProperty.Name; } }
public bool IsEvent { get { return FirstProperty.IsEvent; } } public bool IsEvent { get { return FirstProperty.IsEvent; } }
@ -53,6 +28,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
public PropertyNode Parent { get; private set; } public PropertyNode Parent { get; private set; }
public int Level { get; private set; } public int Level { get; private set; }
public Category Category { get; set; }
public ObservableCollection<PropertyNode> Children { get; private set; } public ObservableCollection<PropertyNode> Children { get; private set; }
public ObservableCollection<PropertyNode> MoreChildren { get; private set; } public ObservableCollection<PropertyNode> MoreChildren { get; private set; }
@ -86,7 +62,9 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
public object Value { public object Value {
get { get {
if (IsAmbiguous) return null; if (IsAmbiguous) return null;
return FirstProperty.ValueOnInstance; var result = FirstProperty.ValueOnInstance;
if (result == DependencyProperty.UnsetValue) return null;
return result;
} }
set { set {
SetValueCore(value); SetValueCore(value);
@ -95,11 +73,28 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
public string ValueString { public string ValueString {
get { get {
if (Value == null) return null; if (ValueItem == null || ValueItem.Component is MarkupExtension) {
return FirstProperty.TypeConverter.ConvertToString(Value); if (Value == null) return null;
if (hasStringConverter) {
return FirstProperty.TypeConverter.ConvertToInvariantString(Value);
}
return "(" + Value.GetType().Name + ")";
}
return "(" + ValueItem.ComponentType.Name + ")";
} }
set { set {
Value = FirstProperty.TypeConverter.ConvertFromString(value); // TODO: Doesn't work for some reason
try {
Value = FirstProperty.TypeConverter.ConvertFromInvariantString(value);
} catch {
OnValueOnInstanceChanged();
}
}
}
public bool IsEnabled {
get {
return ValueItem == null && hasStringConverter;
} }
} }
@ -118,6 +113,28 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
} }
} }
public Brush NameForeground {
get {
if (ValueItem != null) {
if (ValueItem.Component is BindingBase)
return Brushes.DarkGoldenrod;
if (ValueItem.Component is StaticResourceExtension ||
ValueItem.Component is DynamicResourceExtension)
return Brushes.DarkGreen;
}
return SystemColors.WindowTextBrush;
}
}
public DesignItem ValueItem {
get {
if (Properties.Length == 1) {
return FirstProperty.Value;
}
return null;
}
}
public bool IsAmbiguous { public bool IsAmbiguous {
get { get {
foreach (var p in Properties) { foreach (var p in Properties) {
@ -129,6 +146,21 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
} }
} }
bool isVisible;
public bool IsVisible
{
get
{
return isVisible;
}
set
{
isVisible = value;
RaisePropertyChanged("IsVisible");
}
}
public bool CanReset { public bool CanReset {
get { return IsSet; } get { return IsSet; }
} }
@ -168,28 +200,86 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
RaisePropertyChanged("ValueString"); RaisePropertyChanged("ValueString");
RaisePropertyChanged("IsAmbiguous"); RaisePropertyChanged("IsAmbiguous");
RaisePropertyChanged("FontWeight"); RaisePropertyChanged("FontWeight");
RaisePropertyChanged("IsEnabled");
RaisePropertyChanged("NameForeground");
UpdateChildren(); UpdateChildren();
} }
void OnValueOnInstanceChanged()
{
RaisePropertyChanged("Value");
RaisePropertyChanged("ValueString");
}
public PropertyNode()
{
Children = new ObservableCollection<PropertyNode>();
MoreChildren = new ObservableCollection<PropertyNode>();
}
PropertyNode(DesignItemProperty[] properties, PropertyNode parent) : this()
{
this.Parent = parent;
this.Level = parent == null ? 0 : parent.Level + 1;
Load(properties);
}
public void Load(DesignItemProperty[] properties)
{
if (Properties != null) {
foreach (var property in Properties) {
property.ValueChanged -= new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged -= new EventHandler(property_ValueOnInstanceChanged);
}
}
this.Properties = properties;
foreach (var property in properties) {
property.ValueChanged += new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged += new EventHandler(property_ValueOnInstanceChanged);
}
if (Editor == null)
Editor = EditorManager.CreateEditor(FirstProperty);
hasStringConverter =
FirstProperty.TypeConverter.CanConvertFrom(typeof(string)) &&
FirstProperty.TypeConverter.CanConvertTo(typeof(string));
OnValueChanged();
}
void property_ValueOnInstanceChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueOnInstanceChanged();
}
void property_ValueChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueChanged();
}
void UpdateChildren() void UpdateChildren()
{ {
Children.Clear(); Children.Clear();
MoreChildren.Clear(); MoreChildren.Clear();
if (Parent == null || Parent.IsExpanded) { if (Parent == null || Parent.IsExpanded) {
if (IsAmbiguous || FirstProperty.IsCollection || FirstProperty.Value == null) {} if (ValueItem != null) {
else { var list = TypeHelper.GetAvailableProperties(ValueItem.ComponentType)
var item = FirstProperty.Value;
var list = TypeHelper.GetAvailableProperties(item.ComponentType)
.OrderBy(d => d.Name) .OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { item.Properties[d.Name] }, this)); .Select(d => new PropertyNode(new[] { ValueItem.Properties[d.Name] }, this));
foreach (var node in list) { foreach (var node in list) {
if (Metadata.IsAdvanced(node.FirstProperty)) { if (Metadata.IsBrowsable(node.FirstProperty)) {
MoreChildren.Add(node); node.IsVisible = true;
} else { if (Metadata.IsPopular(node.FirstProperty)) {
Children.Add(node); Children.Add(node);
} else {
MoreChildren.Add(node);
}
} }
} }
} }

44
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/SortedObservableCollection.cs

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
namespace ICSharpCode.WpfDesign.PropertyGrid
{
public class SortedObservableCollection<T, K> : ObservableCollection<T>
{
public SortedObservableCollection(Func<T, K> keySelector)
{
this.keySelector = keySelector;
this.comparer = Comparer<K>.Default;
}
Func<T, K> keySelector;
IComparer<K> comparer;
public void AddSorted(T item)
{
int i = 0;
int j = Count - 1;
while (i <= j) {
int n = (i + j) / 2;
int c = comparer.Compare(keySelector(item), keySelector(this[n]));
if (c == 0) { i = n; break; }
if (c > 0) i = n + 1;
else j = n - 1;
}
Insert(i, item);
}
}
public class PropertyNodeCollection : SortedObservableCollection<PropertyNode, string>
{
public PropertyNodeCollection() : base(n => n.Name)
{
}
}
}

3
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/WpfDesign.csproj

@ -52,6 +52,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="WindowsBase"> <Reference Include="WindowsBase">
<Private>False</Private> <Private>False</Private>
@ -93,6 +94,7 @@
<Compile Include="PlacementOperation.cs" /> <Compile Include="PlacementOperation.cs" />
<Compile Include="PlacementType.cs" /> <Compile Include="PlacementType.cs" />
<Compile Include="PlacementAlignment.cs" /> <Compile Include="PlacementAlignment.cs" />
<Compile Include="PropertyGrid\Category.cs" />
<Compile Include="PropertyGrid\EditorManager.cs" /> <Compile Include="PropertyGrid\EditorManager.cs" />
<Compile Include="PropertyGrid\Editors\ComboBoxEditor.xaml.cs"> <Compile Include="PropertyGrid\Editors\ComboBoxEditor.xaml.cs">
<DependentUpon>ComboBoxEditor.xaml</DependentUpon> <DependentUpon>ComboBoxEditor.xaml</DependentUpon>
@ -102,6 +104,7 @@
</Compile> </Compile>
<Compile Include="PropertyGrid\PropertyEditorAttribute.cs" /> <Compile Include="PropertyGrid\PropertyEditorAttribute.cs" />
<Compile Include="PropertyGrid\PropertyNode.cs" /> <Compile Include="PropertyGrid\PropertyNode.cs" />
<Compile Include="PropertyGrid\SortedObservableCollection.cs" />
<Compile Include="PropertyGrid\TypeEditorAttribute.cs" /> <Compile Include="PropertyGrid\TypeEditorAttribute.cs" />
<Compile Include="PropertyGrid\TypeHelper.cs" /> <Compile Include="PropertyGrid\TypeHelper.cs" />
<Compile Include="ServiceContainer.cs" /> <Compile Include="ServiceContainer.cs" />

Loading…
Cancel
Save