记录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}" />

 

posted @ 2021-11-12 15:00  Snowdestiny  阅读(640)  评论(1)    收藏  举报