@@ -11,6 +11,7 @@ namespace JitHub.WinUI.Views.Controls.CodeViewer;
1111public sealed partial class FilePreviewHost : UserControl
1212{
1313 private RepoFilePreviewViewModel ? _viewModel ;
14+ private RepoFilePreviewKind ? _currentRendererKind ;
1415
1516 public FilePreviewHost ( )
1617 {
@@ -54,7 +55,7 @@ private void UpdateState()
5455 EmptyState . Visibility = Visibility . Visible ;
5556 LoadingState . Visibility = Visibility . Collapsed ;
5657 ErrorState . Visibility = Visibility . Collapsed ;
57- RendererHost . Content = null ;
58+ ClearRenderer ( ) ;
5859 return ;
5960 }
6061
@@ -73,7 +74,7 @@ private void UpdateState()
7374 EmptyState . Visibility = Visibility . Collapsed ;
7475 ErrorMessageText . Text = vm . ErrorMessage ;
7576 ErrorState . Visibility = Visibility . Visible ;
76- RendererHost . Content = null ;
77+ ClearRenderer ( ) ;
7778 return ;
7879 }
7980
@@ -82,17 +83,44 @@ private void UpdateState()
8283 if ( vm . CurrentFile is null )
8384 {
8485 EmptyState . Visibility = Visibility . Visible ;
85- RendererHost . Content = null ;
86+ ClearRenderer ( ) ;
8687 return ;
8788 }
8889
8990 EmptyState . Visibility = Visibility . Collapsed ;
90- RendererHost . Content = CreateRenderer ( vm ) ;
91+ EnsureRenderer ( vm ) ;
9192 }
9293
93- private static FrameworkElement CreateRenderer ( RepoFilePreviewViewModel vm )
94+ private void EnsureRenderer ( RepoFilePreviewViewModel vm )
9495 {
95- FrameworkElement renderer = vm . Kind switch
96+ // Keep the renderer instance stable while the preview kind is unchanged.
97+ // Markdown selection owns pointer capture; replacing the control during a
98+ // queued preview refresh drops that capture in packaged builds.
99+ if ( RendererHost . Content is FrameworkElement existing &&
100+ _currentRendererKind == vm . Kind )
101+ {
102+ if ( ! ReferenceEquals ( existing . DataContext , vm ) )
103+ existing . DataContext = vm ;
104+ return ;
105+ }
106+
107+ var renderer = CreateRenderer ( vm . Kind ) ;
108+ renderer . HorizontalAlignment = HorizontalAlignment . Stretch ;
109+ renderer . VerticalAlignment = VerticalAlignment . Stretch ;
110+ renderer . DataContext = vm ;
111+ RendererHost . Content = renderer ;
112+ _currentRendererKind = vm . Kind ;
113+ }
114+
115+ private void ClearRenderer ( )
116+ {
117+ RendererHost . Content = null ;
118+ _currentRendererKind = null ;
119+ }
120+
121+ private static FrameworkElement CreateRenderer ( RepoFilePreviewKind kind )
122+ {
123+ return kind switch
96124 {
97125 RepoFilePreviewKind . Code => new CodePreview ( ) ,
98126 RepoFilePreviewKind . Markdown => new MarkdownPreview ( ) ,
@@ -107,9 +135,5 @@ private static FrameworkElement CreateRenderer(RepoFilePreviewViewModel vm)
107135 RepoFilePreviewKind . TooLarge => new UnsupportedPreview ( ) ,
108136 _ => new UnsupportedPreview ( ) ,
109137 } ;
110- renderer . HorizontalAlignment = HorizontalAlignment . Stretch ;
111- renderer . VerticalAlignment = VerticalAlignment . Stretch ;
112- renderer . DataContext = vm ;
113- return renderer ;
114138 }
115139}
0 commit comments