记录WPF里ViewBox下的TextBox框,光标消失问题
新建一个类继承TextBox
1 public class TBwithVisibleCaret : TextBox 2 { 3 private UIElement _flowDocumentView; 4 private AdornerLayer _adornerLayer; 5 private UIElement _caretSubElement; 6 private ScaleTransform _scaleTransform; 7 private bool _needNew = true; 8 private Viewbox _mainView; 9 10 public TBwithVisibleCaret() 11 { 12 Loaded += (a, b) => 13 { 14 _mainView = BLHelper.GetParentObject<Viewbox>(this, "MainViewBox"); 15 if (_mainView == null) return; 16 PreviewGotKeyboardFocus -= HandleGetFocus; 17 this.LayoutUpdated -= OnResetCaret; 18 19 PreviewGotKeyboardFocus += HandleGetFocus; 20 this.LayoutUpdated += OnResetCaret; 21 }; 22 } 23 24 private void OnResetCaret(object s, EventArgs args) 25 { 26 //_mainView = BLHelper.GetParentObject<Viewbox>(this, "MainViewBox"); 27 if (_mainView == null) return; 28 var child = VisualTreeHelper.GetChild(_mainView, 0) as ContainerVisual; 29 if (child == null) 30 return; 31 var scale = child.Transform as ScaleTransform; 32 this.ScaleX = scale.ScaleX; 33 34 if (!IsKeyboardFocused) return; 35 if (_adornerLayer == null) 36 { 37 if (_flowDocumentView == null) return; 38 _adornerLayer = AdornerLayer.GetAdornerLayer(_flowDocumentView); 39 } 40 if (_adornerLayer == null || _flowDocumentView == null) return; 41 if (_scaleTransform != null && _caretSubElement != null && !_needNew) 42 { 43 _scaleTransform.ScaleX = 1 / ScaleX; 44 //_adornerLayer.Update(_flowDocumentView); 45 } 46 else 47 { 48 var adorners = _adornerLayer.GetAdorners(_flowDocumentView); 49 if (adorners == null || adorners.Length < 1) return; 50 var caret = adorners[0]; 51 _caretSubElement = (UIElement)VisualTreeHelper.GetChild(caret, 0); 52 if (_caretSubElement == null) return; 53 if (!(_caretSubElement.RenderTransform is ScaleTransform)) 54 { 55 _scaleTransform = new ScaleTransform(1 / ScaleX, 1); 56 _caretSubElement.RenderTransform = _scaleTransform; 57 } 58 _needNew = false; 59 } 60 } 61 62 private void HandleGetFocus(object s, KeyboardFocusChangedEventArgs args) 63 { 64 _needNew = true; 65 } 66 67 public override void OnApplyTemplate() 68 { 69 base.OnApplyTemplate(); 70 var cthost = GetTemplateChild("PART_ContentHost") as FrameworkElement; 71 if (cthost == null) 72 return; 73 _flowDocumentView = cthost is ScrollViewer ? (UIElement)((ScrollViewer)cthost).Content : ((Decorator)cthost).Child; 74 } 75 76 public double ScaleX 77 { 78 get { return (double)GetValue(ScaleXProperty); } 79 set { SetValue(ScaleXProperty, value); } 80 } 81 public static readonly DependencyProperty ScaleXProperty = 82 DependencyProperty.Register("ScaleX", typeof(double), typeof(TBwithVisibleCaret), new UIPropertyMetadata(1.0)); 83 }
前台使用:
1 <controls:TBwithVisibleCaret Text="{Binding Content}" />
浙公网安备 33010602011771号