Skip to content

Commit b623148

Browse files
committed
Fix packaged markdown text selection
1 parent a566ac2 commit b623148

4 files changed

Lines changed: 283 additions & 72 deletions

File tree

JitHub.WinUI/Views/Controls/CodeViewer/FilePreviewHost.xaml.cs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace JitHub.WinUI.Views.Controls.CodeViewer;
1111
public 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

Comments
 (0)