From 8ade80371c16698619e63da9f8a176c5e6d5a2a2 Mon Sep 17 00:00:00 2001 From: michael-hawker Date: Tue, 24 Mar 2020 16:02:21 -0700 Subject: [PATCH 1/2] Add TemplateParts to InfiniteCanvas and use consts for strings --- .../InfiniteCanvas/InfiniteCanvas.cs | 75 ++++++++++++++----- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.cs b/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.cs index 90134e7b601..c2c80be3b4f 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.cs @@ -19,12 +19,49 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls /// /// InfiniteCanvas is a canvas that supports Ink, Text, Format Text, Zoom in/out, Redo, Undo, Export canvas data, Import canvas data. /// + [TemplatePart(Name = CanvasTextBoxToolsName, Type = typeof(StackPanel))] + [TemplatePart(Name = CanvasTextBoxColorPickerName, Type = typeof(ColorPicker))] + [TemplatePart(Name = CanvasTextBoxFontSizeTextBoxName, Type = typeof(TextBox))] + [TemplatePart(Name = CanvasTextBoxItalicButtonName, Type = typeof(ToggleButton))] + [TemplatePart(Name = CanvasTextBoxBoldButtonName, Type = typeof(ToggleButton))] + [TemplatePart(Name = DrawingSurfaceRendererName, Type = typeof(InfiniteCanvasVirtualDrawingSurface))] + [TemplatePart(Name = MainContainerName, Type = typeof(Canvas))] + [TemplatePart(Name = InfiniteCanvasScrollViewerName, Type = typeof(ScrollViewer))] + [TemplatePart(Name = EraseAllButtonName, Type = typeof(Button))] + [TemplatePart(Name = CanvasTextBoxName, Type = typeof(InfiniteCanvasTextBox))] + [TemplatePart(Name = EnableTextButtonName, Type = typeof(InkToolbarCustomToolButton))] + [TemplatePart(Name = EnableTouchInkingButtonName, Type = typeof(InkToolbarCustomToggleButton))] + [TemplatePart(Name = InkCanvasToolBarName, Type = typeof(InkToolbar))] + [TemplatePart(Name = CanvasToolbarContainerName, Type = typeof(StackPanel))] + [TemplatePart(Name = DrawingInkCanvasName, Type = typeof(InkCanvas))] + [TemplatePart(Name = UndoButtonName, Type = typeof(Button))] + [TemplatePart(Name = RedoButtonName, Type = typeof(Button))] + [TemplatePart(Name = FontColorIconName, Type = typeof(FontIcon))] public partial class InfiniteCanvas : Control { private const double DefaultMaxZoomFactor = 4.0; private const double DefaultMinZoomFactor = .25; private const double LargeCanvasWidthHeight = 1 << 21; + private const string CanvasTextBoxToolsName = "CanvasTextBoxTools"; + private const string CanvasTextBoxColorPickerName = "CanvasTextBoxColorPicker"; + private const string CanvasTextBoxFontSizeTextBoxName = "CanvasTextBoxFontSizeTextBox"; + private const string CanvasTextBoxItalicButtonName = "CanvasTextBoxItalicButton"; + private const string CanvasTextBoxBoldButtonName = "CanvasTextBoxBoldButton"; + private const string DrawingSurfaceRendererName = "DrawingSurfaceRenderer"; + private const string MainContainerName = "MainContainer"; + private const string InfiniteCanvasScrollViewerName = "InfiniteCanvasScrollViewer"; + private const string EraseAllButtonName = "EraseAllButton"; + private const string CanvasTextBoxName = "CanvasTextBox"; + private const string EnableTextButtonName = "EnableTextButton"; + private const string EnableTouchInkingButtonName = "EnableTouchInkingButton"; + private const string InkCanvasToolBarName = "InkCanvasToolBar"; + private const string CanvasToolbarContainerName = "CanvasToolbarContainer"; + private const string DrawingInkCanvasName = "DrawingInkCanvas"; + private const string UndoButtonName = "UndoButton"; + private const string RedoButtonName = "RedoButton"; + private const string FontColorIconName = "FontColorIcon"; + private InkCanvas _inkCanvas; private InfiniteCanvasVirtualDrawingSurface _drawingSurfaceRenderer; private InkSynchronizer _inkSync; @@ -163,25 +200,25 @@ public InfiniteCanvas() /// protected override void OnApplyTemplate() { - _canvasTextBoxTools = (StackPanel)GetTemplateChild("CanvasTextBoxTools"); - _canvasTextBoxColorPicker = (ColorPicker)GetTemplateChild("CanvasTextBoxColorPicker"); - _canvasTextBoxFontSizeTextBox = (TextBox)GetTemplateChild("CanvasTextBoxFontSizeTextBox"); - _canvasTextBoxItalicButton = (ToggleButton)GetTemplateChild("CanvasTextBoxItalicButton"); - _canvasTextBoxBoldButton = (ToggleButton)GetTemplateChild("CanvasTextBoxBoldButton"); - _drawingSurfaceRenderer = (InfiniteCanvasVirtualDrawingSurface)GetTemplateChild("DrawingSurfaceRenderer"); - _mainContainer = (Canvas)GetTemplateChild("MainContainer"); - _infiniteCanvasScrollViewer = (ScrollViewer)GetTemplateChild("InfiniteCanvasScrollViewer"); - _eraseAllButton = (Button)GetTemplateChild("EraseAllButton"); - _canvasTextBox = (InfiniteCanvasTextBox)GetTemplateChild("CanvasTextBox"); - _enableTextButton = (InkToolbarCustomToolButton)GetTemplateChild("EnableTextButton"); - _enableTouchInkingButton = (InkToolbarCustomToggleButton)GetTemplateChild("EnableTouchInkingButton"); - _inkCanvasToolBar = (InkToolbar)GetTemplateChild("InkCanvasToolBar"); - _canvasToolbarContainer = (StackPanel)GetTemplateChild("CanvasToolbarContainer"); - - _inkCanvas = (InkCanvas)GetTemplateChild("DrawingInkCanvas"); - _undoButton = (Button)GetTemplateChild("UndoButton"); - _redoButton = (Button)GetTemplateChild("RedoButton"); - _fontColorIcon = (FontIcon)GetTemplateChild("FontColorIcon"); + _canvasTextBoxTools = (StackPanel)GetTemplateChild(CanvasTextBoxToolsName); + _canvasTextBoxColorPicker = (ColorPicker)GetTemplateChild(CanvasTextBoxColorPickerName); + _canvasTextBoxFontSizeTextBox = (TextBox)GetTemplateChild(CanvasTextBoxFontSizeTextBoxName); + _canvasTextBoxItalicButton = (ToggleButton)GetTemplateChild(CanvasTextBoxItalicButtonName); + _canvasTextBoxBoldButton = (ToggleButton)GetTemplateChild(CanvasTextBoxBoldButtonName); + _drawingSurfaceRenderer = (InfiniteCanvasVirtualDrawingSurface)GetTemplateChild(DrawingSurfaceRendererName); + _mainContainer = (Canvas)GetTemplateChild(MainContainerName); + _infiniteCanvasScrollViewer = (ScrollViewer)GetTemplateChild(InfiniteCanvasScrollViewerName); + _eraseAllButton = (Button)GetTemplateChild(EraseAllButtonName); + _canvasTextBox = (InfiniteCanvasTextBox)GetTemplateChild(CanvasTextBoxName); + _enableTextButton = (InkToolbarCustomToolButton)GetTemplateChild(EnableTextButtonName); + _enableTouchInkingButton = (InkToolbarCustomToggleButton)GetTemplateChild(EnableTouchInkingButtonName); + _inkCanvasToolBar = (InkToolbar)GetTemplateChild(InkCanvasToolBarName); + _canvasToolbarContainer = (StackPanel)GetTemplateChild(CanvasToolbarContainerName); + + _inkCanvas = (InkCanvas)GetTemplateChild(DrawingInkCanvasName); + _undoButton = (Button)GetTemplateChild(UndoButtonName); + _redoButton = (Button)GetTemplateChild(RedoButtonName); + _fontColorIcon = (FontIcon)GetTemplateChild(FontColorIconName); UnRegisterEvents(); RegisterEvents(); From 8272585be33c22fb650cb2b79d0532260d2887b8 Mon Sep 17 00:00:00 2001 From: michael-hawker Date: Tue, 24 Mar 2020 16:02:42 -0700 Subject: [PATCH 2/2] Fix potential null reference issue with re-templated InfiniteCanvas --- .../InfiniteCanvas/InfiniteCanvas.TextBox.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.TextBox.cs b/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.TextBox.cs index c8559f9933e..94a537fbb53 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.TextBox.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/InfiniteCanvas/InfiniteCanvas.TextBox.cs @@ -116,7 +116,10 @@ private void CanvasTextBoxColorPicker_ColorChanged(ColorPicker sender, ColorChan ReDrawCanvas(); } - _fontColorIcon.Foreground = new SolidColorBrush(_canvasTextBoxColorPicker.Color); + if (_fontColorIcon != null) + { + _fontColorIcon.Foreground = new SolidColorBrush(_canvasTextBoxColorPicker.Color); + } } private void CanvasTextBox_TextChanged(object sender, string text)