c#


Detecting underline in selected WPF RichTextBox control from generated XAML code


Full repro: https://github.com/Myrmex/wpf-reprounderline. Please see instructions below.
I'm using a RichTextBox control in a WPF app getting its content from programmatically generated XAML code. In this control, I need to place toggle buttons for bold, italic, and underline, and update their toggle status whenever the user's selection changes, so that they reflect the status of selected text.
This works fine, except for a detail: detecting underline from the selected text (or just the text under the caret, when the selection is empty) does NOT work UNLESS I replace Span with Run. I can see the underline decoration displayed in both cases in the control, but if I place the caret inside it, it does not reflect this decoration: TextDecorations is empty.
This is a sample of the "faulty" generated XAML code:
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Paragraph><Span Foreground="#FFFF0000">hello</Span> <Span><Span.TextDecorations><TextDecoration Location="Underline" /></Span.TextDecorations>under</Span></Paragraph></FlowDocument>
If I set the content of the WPF control to this code, underline is NOT detected. If I replace Span with Run, it does work, but I cannot do this in real code, as the XAML generator uses Span's rather than Run's to ensure that they can be nested (a Run only allows text children).
I tried with the attribute notation (<Span TextDecorations="Underline">...</Span>), but nothing changes. Whenever I manually underline something, the WPF control emits Run's, so that they work. Yet, it does not when using Span's.
Here is my detection code:
private void OnSelectionChanged(object sender, RoutedEventArgs e)
{
// italic
object temp = _rtb.Selection.GetPropertyValue(TextElement.FontStyleProperty);
_tbbItalic.IsChecked =
temp != DependencyProperty.UnsetValue &&
temp != null &&
temp.Equals(FontStyles.Italic);
// bold
temp = _rtb.Selection.GetPropertyValue(TextElement.FontWeightProperty);
_tbbBold.IsChecked = temp != DependencyProperty.UnsetValue &&
temp != null &&
temp.Equals(FontWeights.Bold);
// underline
temp = _rtb.Selection.GetPropertyValue(Inline.TextDecorationsProperty);
_tbbUnderline.IsChecked = temp != DependencyProperty.UnsetValue &&
temp != null &&
temp.Equals(TextDecorations.Underline);
}
I have prepared a full repro solution: just launch the app and type something, adding bold, italic, underline; then move the caret around, and see how these are reflected in the buttons. You can get the WPF control's XAML code using the Get XAML button. Then load the faulty XAML code using the Load faulty button, and set the WPF control's content using the Set XAML button. Now, if you place the caret inside the underlined text, the underline is not detected. If you replace Span with Run, and set the WPF content again, this works.
Could anyone suggest a solution?

Related Links

Global assemby reference?
What is the reason for ICommand in Mvvm?
Inputting text with commas into datagrid wpf
Arithmetic operations using console application
Asp.Net Core redirect to action but not allow action to be called directly?
C# RESTful WebApi post data in Arabic language in json but receiving?
'Access to the path is denied' error while accessing network drive
convert xml file into flat file in a tabular format
How to take the difference of Last_Logout and Last_Login in ASP.NET C#
Why do Win Forms Apps have Main in a static class and should I stay within in
C# Create EXACT copy of table from ODBC Datasource into SQL Server table
Unity - mobile device camera is mirrored
Fetch mail-body via IMAP through lumiSoft
C# Updating Dataset and DataGridView
Stop Net Browser Caching
Resizing image makes grid getting out from window

Categories

HOME
mobile
gsm
customization
cxf
grpc
readdir
gaussian
schema
restheart
segmentation-fault
activejdbc
urllib2
github-flavored-markdown
infopath
loss
nsoperation
template10
legend-properties
react-jsx
jq
serenity-js
jira-zephyr
deployment-descriptor
rollupjs
libxml2
csproj
andengine
ibm-bpm
mplab
wercker
campaign-monitor
latency
mybatis-generator
linkurious
smooth-streaming
f#-fake
grails-2.0
api-key
hierarchical-clustering
runner
cloudconvert
openidm
dna-sequence
enet
px4
jenkins-docker
htop
selection-sort
printer-control-language
bipartite
spring-cloud-aws
alfred
settext
hdr
normalisation
system-integration
mod
wordpress-plugin
dynamics-nav-2013
imageicon
producer-consumer
persian
bootstrap-tabs
android-filterable
vectordrawable
google-experiments
frisby.js
illegalargumentexception
xts
behance-api
twitter-finagle
ant-contrib
code-smell
pidgin
kuka-krl
mdp
imaplib
ironworker
oc4j
violation
asp.net-4.0
qt5.1
ncml
invalidoperationexception
report-viewer2010
reflexil
discussion-board
log-shipping
opendir
xcdatamodel
p4.net
webdb
versions
code-golf
web-widget
lts
ihtmldocument2
bootstrap-protocol
expander
stackless
hotfix

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App