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

Use One Temporary File Many Times
ToolStripMenuItem location relative to parent
Swapping a key with a value in a dictionary in C#
What is the proper way to designate the data context and bind hierarchical data in the treeview?
foreach keeps creating blank elements
Reusable Included Layouts
Choosing right representation of entity [closed]
Entity framework one-to-many relationship - how to rename foreign key name when it is named Id?
Searching Tri Data Structure
How to see how many thread is working to complete my task TPL?
How can I Store this pointer in a buffer in C#?
How to dispose of DbContext in WebApi?
Use namedPipe or UDP?
How to call my int array class to ad my dropdownlist [closed]
Track a stick with blob tracking or by color? Using Kinect, opencv and C#
WinRT RemovableDevices: Music folder: Cannot create items within this StorageFolder

Categories

HOME
ns2
fortran
mysqli
pelican
glsl
azure-database-mysql
thermal-printer
liquidsoap
annyang
subprocess
expo
jquery-easyui
bootstrap-datetimepicker
sonarlint
lotusscript
waterfall
core-animation
large-files
windows-10-mobile
cqlsh
pushpad
spring-data-gemfire
r-factor
folder
wercker
flickr
webmock
machine-code
odp.net
tunnel
headphones
javafxports
maven-2
strategy-pattern
jslider
wicket-tester
cakephp-3.2
servicebus
r-commander
group
portaudio
blackberry-webworks
strtol
x12
virtualenvwrapper
audiorecord
jde
window.location
jcalendar
android-contentresolver
pushwoosh
roslyn-code-analysis
autoscaling
dcg
pdcurses
firewire
drools-guvnor
javadb
powerpoint-2010
smartxls
traceur
slimscroll
boofcv
xcode5.1
google-oauth-java-client
sygic
ie-developer-tools
ojb
caroufredsel
objectdatasource
playing-cards
removeall
exi
cocotron
brew
zepto
screensharing
yii-components
big-endian
nserror
datasheet
mvcmailer
cinder
chars
mediastreamsource
web-widget
script-tag
bootstrap-protocol

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