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

Kinect Not Showing Color Image
Print db content into multiple textboxes without using dataset
Solving a postfix notation expression in c#
Serialize Lucene.net Document
Pros/Cons of Stream[Reader/Writer]
Thread safe public string
DataTable.Select as DataSource of DataList
Moq multi interfaces
c# interact html maybe php and javascript with wpf applications
Want to Transmit a live feed from Cellphone to Custom Application over bluetooth
Deleting characters written by Console.Write method
Multiple forms in MVC3
GetAllNetworkInterfaces() throws exception
Implement “not in” (aka “not exists”) logic in LINQ
Bind with WindowsFormsHost
Change column style depending of source

Categories

HOME
ide
system-calls
locale
jenkins-pipeline
spotfire
cryengine
crm
ms-application-insights
sms
sugarcrm
clip-path
annyang
rtc
ejb-3.0
jcodemodel
core-data
dynamics-crm-2011
osclass
guidewire
swift3.1
minimum
react-select
background-image
luis
draw2d
conditional-formatting
gomobile
turn.js
beaker-notebook
v4l2
functional-dependencies
tftp
cloudformation
boosting
dynamic-memory-allocation
cqlsh
sphinx4
ipython-parallel
openoffice-impress
edsdk
wordpress-rest-api
ios-autolayout
wercker
android-scrollview
yelp
scalamock
idea-plugin
ui-grid
uitextview
vpython
apiman
text-extraction
taiga
python-venv
serialversionuid
dotnet-cli
business-catalyst
tsc
robotc
sharing
addressbook
blackberry-webworks
eclipse-mars
hoare-logic
qtruby
kik
firefox-os
containstable
tvp
javapackager
gulp-cdnizer
gitk
updating
tess4j
vspackage
page-refresh
teamwork
httpmodule
radgrid
beagleboard
pymol
jad
mri
fedena
frisby.js
novell
sync
famous-engine
vundle
nspopupbutton
enquire.js
nativequery
facebook-likebox
xml-validation
jfilechooser
sygic
infomaker
oc4j
violation
playing-cards
record-locking
infinity.js
junction-table
msbuild-task
pageload
wpml
towerjs
yii-cactiverecord
httppostedfilebase
netbeans7.0
azure-appfabric
subdirectories
nstoolbar
web-widget
ihtmldocument2
high-load
weak-typing
ironpython-studio
memory-consumption

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