From 45761d3824984f577ad066016a1aac3f794883d2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Oct 2009 19:22:19 +0000 Subject: [PATCH] Implemented option panels for text editor. Replaced ContentControl with ContentPresenter where possible. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5076 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AvalonEdit.AddIn/AvalonEdit.AddIn.csproj | 11 +++ .../AvalonEdit.AddIn/Src/CodeEditor.cs | 3 - .../AvalonEdit.AddIn/Src/CodeEditorView.cs | 8 +- .../Src/Options/BehaviorOptions.xaml | 6 +- .../Src/Options/CodeEditorOptions.cs | 75 +++++++++++++++++++ .../Src/Options/GeneralEditorOptions.xaml | 21 ++++-- .../Src/Options/GeneralEditorOptions.xaml.cs | 17 +++++ .../Src/Options/TextViewOptions.xaml | 29 +++++++ .../Src/Options/TextViewOptions.xaml.cs | 32 ++++++++ .../Project/Gui/ResultsTreeView.xaml | 2 +- .../Src/Editor/Search/SearchResultsPad.cs | 4 +- .../AbstractViewContentHandlingLoadErrors.cs | 2 +- .../Src/Gui/Dialogs/AbstractOptionPanel.cs | 14 ++-- .../Gui/Dialogs/TreeViewOptionsDialog.xaml | 2 +- .../Gui/Dialogs/TreeViewOptionsDialog.xaml.cs | 3 + .../Base/Project/Src/Gui/Pads/OutlinePad.cs | 2 +- .../Src/Gui/Pads/PropertyPad/PropertyPad.cs | 4 +- .../Base/Project/Src/Gui/Pads/ToolsPad.cs | 2 +- .../Src/Gui/Workbench/WpfWorkbench.xaml | 2 +- .../Base/Project/Src/Util/ExtensionMethods.cs | 37 +++++++++ .../CollapsiblePanel.cs | 2 + 21 files changed, 250 insertions(+), 28 deletions(-) create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index c0643399b3..9778adb9c1 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -50,6 +50,7 @@ 3.5 + @@ -90,6 +91,10 @@ Code + + TextViewOptions.xaml + Code + @@ -136,6 +141,11 @@ ICSharpCode.Core.Presentation False + + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} + ICSharpCode.Core.WinForms + False + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} ICSharpCode.SharpDevelop.Dom @@ -144,6 +154,7 @@ + SnippetOptionPanel.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index eaccd6f245..588c14553e 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -167,9 +167,6 @@ namespace ICSharpCode.AvalonEdit.AddIn textView.Services.AddService(typeof(CodeEditor), this); textEditor.Background = Brushes.White; - textEditor.FontFamily = new FontFamily("Consolas, Courier New"); - textEditor.FontSize = 13; - textEditor.ShowLineNumbers = true; textEditor.TextArea.TextEntering += TextAreaTextEntering; textEditor.TextArea.TextEntered += TextAreaTextEntered; textEditor.TextArea.Caret.PositionChanged += TextAreaCaretPositionChanged; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index cfba9ff987..bfc920e6c0 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -14,6 +14,7 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; +using ICSharpCode.AvalonEdit.AddIn.Options; using ICSharpCode.AvalonEdit.AddIn.Snippets; using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Rendering; @@ -34,10 +35,13 @@ namespace ICSharpCode.AvalonEdit.AddIn { public ITextEditor Adapter { get; set; } + CodeEditorOptions options; + public CodeEditorView() { this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Help, OnHelpExecuted)); - this.Options = ICSharpCode.AvalonEdit.AddIn.Options.CodeEditorOptions.Instance; + options = ICSharpCode.AvalonEdit.AddIn.Options.CodeEditorOptions.Instance; + options.BindToTextEditor(this); this.MouseHover += TextEditorMouseHover; this.MouseHoverStopped += TextEditorMouseHoverStopped; @@ -269,7 +273,7 @@ namespace ICSharpCode.AvalonEdit.AddIn { // close existing popup immediately on text editor mouse down TryCloseExistingPopup(false); - if (e.ChangedButton == MouseButton.Left && Keyboard.Modifiers == ModifierKeys.Control) { + if (options.CtrlClickGoToDefinition && e.ChangedButton == MouseButton.Left && Keyboard.Modifiers == ModifierKeys.Control) { var position = GetPositionFromPoint(e.GetPosition(this)); if (position != null) { Core.AnalyticsMonitorService.TrackFeature(typeof(GoToDefinition).FullName, "Ctrl+Click"); diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml index 81e2dea366..218a0a31c9 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml @@ -17,6 +17,8 @@ IsChecked="{core:OptionBinding local:CodeEditorOptions.ConvertTabsToSpaces}" Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Behaviour.ConvertTabsToSpacesCheckBox}" /> @@ -24,13 +26,13 @@ Header="{core:Localize Dialog.Options.IDEOptions.TextEditor.Behaviour.BehaviourGroupBox}"> - diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs index 4b3f474acb..3f68f4916e 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs @@ -7,6 +7,8 @@ using System; using System.ComponentModel; +using System.Windows.Data; + using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; @@ -28,5 +30,78 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options throw new NotSupportedException(); } } + + string fontFamily = Core.WinForms.WinFormsResourceService.DefaultMonospacedFont.Name; + + public string FontFamily { + get { return fontFamily; } + set { + if (fontFamily != value) { + fontFamily = value; + OnPropertyChanged("FontFamily"); + } + } + } + + double fontSize = 13.0; + + [DefaultValue(13.0)] + public double FontSize { + get { return fontSize; } + set { + if (fontSize != value) { + fontSize = value; + OnPropertyChanged("FontSize"); + } + } + } + + bool showLineNumbers = true; + + [DefaultValue(true)] + public bool ShowLineNumbers { + get { return showLineNumbers; } + set { + if (showLineNumbers != value) { + showLineNumbers = value; + OnPropertyChanged("ShowLineNumbers"); + } + } + } + + bool wordWrap; + + [DefaultValue(false)] + public bool WordWrap { + get { return wordWrap; } + set { + if (wordWrap != value) { + wordWrap = value; + OnPropertyChanged("WordWrap"); + } + } + } + + bool ctrlClickGoToDefinition = true; + + [DefaultValue(true)] + public bool CtrlClickGoToDefinition { + get { return ctrlClickGoToDefinition; } + set { + if (ctrlClickGoToDefinition != value) { + ctrlClickGoToDefinition = value; + OnPropertyChanged("CtrlClickGoToDefinition"); + } + } + } + + public void BindToTextEditor(TextEditor editor) + { + editor.Options = this; + editor.SetBinding(TextEditor.FontFamilyProperty, new Binding("FontFamily") { Source = this }); + editor.SetBinding(TextEditor.FontSizeProperty, new Binding("FontSize") { Source = this }); + editor.SetBinding(TextEditor.ShowLineNumbersProperty, new Binding("ShowLineNumbers") { Source = this }); + editor.SetBinding(TextEditor.WordWrapProperty, new Binding("WordWrap") { Source = this }); + } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml index 35df556068..55149ec817 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml @@ -1,19 +1,30 @@  + x:Class="ICSharpCode.AvalonEdit.AddIn.Options.GeneralEditorOptions" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:winforms="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" xmlns:local="clr-namespace:ICSharpCode.AvalonEdit.AddIn.Options"> - + - - - + + + + diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs index 110e483248..2a5c6274cd 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs @@ -15,6 +15,7 @@ using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; +using ICSharpCode.Core.WinForms; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.AvalonEdit.AddIn.Options @@ -28,5 +29,21 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options { InitializeComponent(); } + + public override void LoadOptions() + { + base.LoadOptions(); + CodeEditorOptions options = CodeEditorOptions.Instance; + fontSelectionPanel.CurrentFont = WinFormsResourceService.LoadFont( + options.FontFamily, (int)Math.Round(options.FontSize * 72.0 / 96.0)); + } + + public override bool SaveOptions() + { + CodeEditorOptions options = CodeEditorOptions.Instance; + options.FontFamily = fontSelectionPanel.CurrentFont.Name; + options.FontSize = Math.Round(fontSelectionPanel.CurrentFont.Size * 96.0 / 72.0); + return base.SaveOptions(); + } } } \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml new file mode 100644 index 0000000000..175cf02a53 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml.cs new file mode 100644 index 0000000000..0c971f17aa --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml.cs @@ -0,0 +1,32 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; + +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.AvalonEdit.AddIn.Options +{ + /// + /// Interaction logic for TextViewOptions.xaml + /// + public partial class TextViewOptions : OptionPanel + { + public TextViewOptions() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.xaml b/src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.xaml index 61a0305b41..5887c54bac 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.xaml +++ b/src/AddIns/Misc/SearchAndReplace/Project/Gui/ResultsTreeView.xaml @@ -11,7 +11,7 @@ - + \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs b/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs index 3d5a68b6f6..26c77a1ed6 100644 --- a/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs +++ b/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs @@ -33,7 +33,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Search DockPanel dockPanel; ToolBar toolBar; - ContentControl contentPlaceholder; + ContentPresenter contentPlaceholder; IList defaultToolbarItems; public SearchResultsPad() @@ -49,7 +49,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Search } DockPanel.SetDock(toolBar, Dock.Top); - contentPlaceholder = new ContentControl(); + contentPlaceholder = new ContentPresenter(); dockPanel = new DockPanel { Children = { toolBar, contentPlaceholder } }; diff --git a/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs b/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs index d64e343fdb..81a5c61cd1 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// public abstract class AbstractViewContentHandlingLoadErrors : AbstractViewContent { - ContentControl contentControl = new ContentControl(); + ContentPresenter contentControl = new ContentPresenter(); object userContent; protected AbstractViewContentHandlingLoadErrors() diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/AbstractOptionPanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/AbstractOptionPanel.cs index b41cdb4223..c0018cf33b 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/AbstractOptionPanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/AbstractOptionPanel.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Windows; using System.Windows.Controls; using System.Windows.Data; @@ -20,9 +21,15 @@ namespace ICSharpCode.SharpDevelop.Gui /// public class OptionPanel : UserControl, IOptionPanel, IOptionBindingContainer { + static OptionPanel() + { + MarginProperty.OverrideMetadata(typeof(OptionPanel), + new FrameworkPropertyMetadata(new Thickness(2, 0, 4, 0))); + } + public virtual object Owner { get; set; } - IList bindings; + IList bindings = new List(); public IList Bindings { get { @@ -50,11 +57,6 @@ namespace ICSharpCode.SharpDevelop.Gui return true; } - public OptionPanel() - { - this.bindings = new List(); - } - public void AddBinding(OptionBinding binding) { this.bindings.Add(binding); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml b/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml index 59688bea26..d96c8c8dc8 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml +++ b/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml @@ -60,7 +60,7 @@ - + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs index 721ddfc8b7..b0e2f4a42c 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs @@ -119,6 +119,9 @@ namespace ICSharpCode.SharpDevelop.Gui get { if (optionPanel == null) { optionPanel = OptionPanelDescriptor.OptionPanel; + if (optionPanel == null) { + return null; + } optionPanel.LoadOptions(); dialog.optionPanels.Add(optionPanel); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/OutlinePad.cs b/src/Main/Base/Project/Src/Gui/Pads/OutlinePad.cs index b25f96d16e..9e72252b39 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/OutlinePad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/OutlinePad.cs @@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// public class OutlinePad : AbstractPadContent { - ContentControl contentControl = new ContentControl(); + ContentPresenter contentControl = new ContentPresenter(); public override object Control { get { diff --git a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs index 85b4d59d60..2a5a16d253 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/PropertyPad/PropertyPad.cs @@ -98,7 +98,7 @@ namespace ICSharpCode.SharpDevelop.Gui } } - System.Windows.Controls.ContentControl contentControl; + System.Windows.Controls.ContentPresenter contentControl; Panel panel; ComboBox comboBox; PropertyGrid grid; @@ -154,7 +154,7 @@ namespace ICSharpCode.SharpDevelop.Gui public PropertyPad() { instance = this; - contentControl = new System.Windows.Controls.ContentControl(); + contentControl = new System.Windows.Controls.ContentPresenter(); panel = new Panel(); grid = new PropertyGrid(); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs index db650a323a..1869c3bf73 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui /// public class ToolsPad : AbstractPadContent { - ContentControl contentControl = new ContentControl(); + ContentPresenter contentControl = new ContentPresenter(); public override object Control { get { diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml index 3b49ed4abe..a90acb6d54 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml +++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 4a2d66a62b..8ca57530aa 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -180,6 +180,11 @@ namespace ICSharpCode.SharpDevelop SetContent(contentControl, content, null); } + public static void SetContent(this ContentPresenter contentControl, object content) + { + SetContent(contentControl, content, null); + } + public static void SetContent(this ContentControl contentControl, object content, object serviceObject) { if (contentControl == null) @@ -211,6 +216,38 @@ namespace ICSharpCode.SharpDevelop } } + + public static void SetContent(this ContentPresenter contentControl, object content, object serviceObject) + { + if (contentControl == null) + throw new ArgumentNullException("contentControl"); + // serviceObject = object implementing the old clipboard/undo interfaces + // to allow WinForms AddIns to handle WPF commands + + var host = contentControl.Content as SDWindowsFormsHost; + if (host != null) { + if (host.Child == content) { + host.ServiceObject = serviceObject; + return; + } + host.Dispose(); + } + if (content is WinForms.Control) { + contentControl.Content = new SDWindowsFormsHost { + Child = (WinForms.Control)content, + ServiceObject = serviceObject, + DisposeChild = false + }; + } else if (content is string) { + contentControl.Content = new TextBlock { + Text = content.ToString(), + TextWrapping = TextWrapping.Wrap + }; + } else { + contentControl.Content = content; + } + } + #region System.Drawing <-> WPF conversions public static System.Drawing.Point ToSystemDrawing(this Point p) { diff --git a/src/Main/ICSharpCode.Core.Presentation/CollapsiblePanel.cs b/src/Main/ICSharpCode.Core.Presentation/CollapsiblePanel.cs index 2b0ecc4f13..0b71205113 100644 --- a/src/Main/ICSharpCode.Core.Presentation/CollapsiblePanel.cs +++ b/src/Main/ICSharpCode.Core.Presentation/CollapsiblePanel.cs @@ -22,6 +22,8 @@ namespace ICSharpCode.Core.Presentation { DefaultStyleKeyProperty.OverrideMetadata(typeof(CollapsiblePanel), new FrameworkPropertyMetadata(typeof(CollapsiblePanel))); + FocusableProperty.OverrideMetadata(typeof(CollapsiblePanel), + new FrameworkPropertyMetadata(false)); } public static readonly DependencyProperty IsCollapsedProperty = DependencyProperty.Register(