Добавление к ответу @ torvin и, как @Dave Huang упомянул в комментариях, если вы включили TextTrimming="CharacterEllipsis"
, приложение вылетает, когда вы наводите курсор на многоточие.
Я пробовал другие варианты, упомянутые в теме об использовании TextBox, но это, похоже, тоже не является решением, так как он не отображает многоточие, а также, если текст слишком длинный, чтобы соответствовать размеру контейнера. содержимое текстового поля «прокручивается» внутри, что не является поведением TextBlock.
Я думаю, что лучшее решение - это ответ @ torvin, но у него неприятный сбой при наведении на многоточие.
Я знаю, что это не красиво, но внутренняя подписка / отмена подписки на необработанные исключения и обработка исключения были единственным способом, который я нашел для решения этой проблемы, пожалуйста, поделитесь, если у кого-то есть лучшее решение:)
public class SelectableTextBlock : TextBlock
{
static SelectableTextBlock()
{
FocusableProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata(true));
TextEditorWrapper.RegisterCommandHandlers(typeof(SelectableTextBlock), true, true, true);
// remove the focus rectangle around the control
FocusVisualStyleProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata((object)null));
}
private readonly TextEditorWrapper _editor;
public SelectableTextBlock()
{
_editor = TextEditorWrapper.CreateFor(this);
this.Loaded += (sender, args) => {
this.Dispatcher.UnhandledException -= Dispatcher_UnhandledException;
this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
};
this.Unloaded += (sender, args) => {
this.Dispatcher.UnhandledException -= Dispatcher_UnhandledException;
};
}
private void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
if (!string.IsNullOrEmpty(e?.Exception?.StackTrace))
{
if (e.Exception.StackTrace.Contains("System.Windows.Controls.TextBlock.GetTextPositionFromDistance"))
{
e.Handled = true;
}
}
}
}