Recently the topic of text hyphenation for Windows Phone has cropped up. So I thought I’d give it a quick go. Note, this is an initial stab at a solution, I’m not suggesting it’s fully functional but certainly could be built upon.
The problem
<TextBox> FontSize="40" Width="170" TextWrapping="Wrap" Text="Hello world combinations can be extremely worrying" />
Possible Solution
The design is pretty simple (although is it Right-To-Left compatible?), check when the text moves from one line to the next. When it does, check to see if the last character is part of a word. It it is, the add a hyphen.
using System.Windows; using System.Windows.Controls; using System.Windows.Interactivity; namespace Pauliom.Behaviors { public class HyphenationBehavior : Behavior<TextBox> { private int lastLength = 0; protected override void OnAttached() { var textBox = this.AssociatedObject; textBox.TextChanged += textBox_TextChanged; textBox.Loaded += textBox_Loaded; base.OnAttached(); } void textBox_Loaded(object sender, RoutedEventArgs e) { Hyphenate(sender); } void textBox_TextChanged(object sender, TextChangedEventArgs e) { Hyphenate(sender); } private void Hyphenate(object sender) { TextBox textBox = sender as TextBox; if (this.lastLength != textBox.Text.Length) { this.lastLength = textBox.Text.Length; Rect lastRectange = textBox.GetRectFromCharacterIndex(1); int x = 0; while (x < textBox.Text.Length) { Rect r = textBox.GetRectFromCharacterIndex(x); if (lastRectange.Top != r.Top) { lastRectange = r; char endChar = textBox.Text[x - 1]; if (endChar != ' ' && endChar != '-') { textBox.Text = textBox.Text.Substring(0, x - 1) + "-" + textBox.Text.Substring(x - 1); } } x++; } } } protected override void OnDetaching() { var textBox = this.AssociatedObject; textBox.TextChanged -= textBox_TextChanged; base.OnDetaching(); } } }
<TextBox> FontSize="40" Width="170" TextWrapping="Wrap" Text="Hello world combinations can be extremely worrying"> <i:Interaction.Behaviors> <pauliom:HyphenationBehavior /> </i:Interaction.Behaviors> </TextBox>
As I said, it probably is not production ready code but could be built upon.