All the controls missing in WPF. Over 1 million downloads.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
9.0 KiB

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Controls.Primitives;
using Microsoft.Windows.Controls.Core;
namespace Microsoft.Windows.Controls
{
/// <summary>
/// Interaction logic for RichTextBoxFormatBar.xaml
/// </summary>
public partial class RichTextBoxFormatBar : UserControl, IRichTextBoxFormatBar
{
#region Properties
#region RichTextBox
public static readonly DependencyProperty TargetProperty = DependencyProperty.Register("Target", typeof(global::System.Windows.Controls.RichTextBox), typeof(RichTextBoxFormatBar), new PropertyMetadata(null, OnRichTextBoxPropertyChanged));
public global::System.Windows.Controls.RichTextBox Target
{
get { return (global::System.Windows.Controls.RichTextBox)GetValue(TargetProperty); }
set { SetValue(TargetProperty, value); }
}
private static void OnRichTextBoxPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RichTextBoxFormatBar formatBar = d as RichTextBoxFormatBar;
}
#endregion //RichTextBox
public static double[] FontSizes
{
get
{
return new double[] {
3.0, 4.0, 5.0, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5,
10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 15.0,
16.0, 17.0, 18.0, 19.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0,
32.0, 34.0, 36.0, 38.0, 40.0, 44.0, 48.0, 52.0, 56.0, 60.0, 64.0, 68.0, 72.0, 76.0,
80.0, 88.0, 96.0, 104.0, 112.0, 120.0, 128.0, 136.0, 144.0
};
}
}
#endregion
#region Constructors
public RichTextBoxFormatBar()
{
InitializeComponent();
Loaded += FormatToolbar_Loaded;
_cmbFontFamilies.ItemsSource = Fonts.SystemFontFamilies;
_cmbFontSizes.ItemsSource = FontSizes;
}
#endregion //Constructors
#region Event Hanlders
void FormatToolbar_Loaded(object sender, RoutedEventArgs e)
{
UpdateVisualState();
}
private void FontFamily_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count == 0)
return;
FontFamily editValue = (FontFamily)e.AddedItems[0];
ApplyPropertyValueToSelectedText(TextElement.FontFamilyProperty, editValue);
}
private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count == 0)
return;
ApplyPropertyValueToSelectedText(TextElement.FontSizeProperty, e.AddedItems[0]);
}
void FontColor_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)
{
Color selectedColor = (Color)e.NewValue;
ApplyPropertyValueToSelectedText(TextElement.ForegroundProperty, new SolidColorBrush(selectedColor));
}
private void FontBackgroundColor_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)
{
Color selectedColor = (Color)e.NewValue;
ApplyPropertyValueToSelectedText(TextElement.BackgroundProperty, new SolidColorBrush(selectedColor));
}
private void Bullets_Clicked(object sender, RoutedEventArgs e)
{
if (BothSelectionListsAreChecked())
{
_btnNumbers.IsChecked = false;
}
}
private void Numbers_Clicked(object sender, RoutedEventArgs e)
{
if (BothSelectionListsAreChecked())
{
_btnBullets.IsChecked = false;
}
}
private void DragWidget_DragDelta(object sender, DragDeltaEventArgs e)
{
ProcessMove(e);
}
#endregion //Event Hanlders
#region Methods
private void UpdateVisualState()
{
UpdateToggleButtonState();
UpdateSelectedFontFamily();
UpdateSelectedFontSize();
UpdateFontColor();
UpdateFontBackgroundColor();
UpdateSelectionListType();
}
private void UpdateToggleButtonState()
{
UpdateItemCheckedState(_btnBold, TextElement.FontWeightProperty, FontWeights.Bold);
UpdateItemCheckedState(_btnItalic, TextElement.FontStyleProperty, FontStyles.Italic);
UpdateItemCheckedState(_btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
UpdateItemCheckedState(_btnAlignLeft, Paragraph.TextAlignmentProperty, TextAlignment.Left);
UpdateItemCheckedState(_btnAlignCenter, Paragraph.TextAlignmentProperty, TextAlignment.Center);
UpdateItemCheckedState(_btnAlignRight, Paragraph.TextAlignmentProperty, TextAlignment.Right);
}
void UpdateItemCheckedState(ToggleButton button, DependencyProperty formattingProperty, object expectedValue)
{
object currentValue = Target.Selection.GetPropertyValue(formattingProperty);
button.IsChecked = (currentValue == DependencyProperty.UnsetValue) ? false : currentValue != null && currentValue.Equals(expectedValue);
}
private void UpdateSelectedFontFamily()
{
object value = Target.Selection.GetPropertyValue(TextElement.FontFamilyProperty);
FontFamily currentFontFamily = (FontFamily)((value == DependencyProperty.UnsetValue) ? null : value);
if (currentFontFamily != null)
{
_cmbFontFamilies.SelectedItem = currentFontFamily;
}
}
private void UpdateSelectedFontSize()
{
object value = Target.Selection.GetPropertyValue(TextElement.FontSizeProperty);
_cmbFontSizes.SelectedValue = (value == DependencyProperty.UnsetValue) ? null : value;
}
private void UpdateFontColor()
{
object value = Target.Selection.GetPropertyValue(TextElement.ForegroundProperty);
Color currentColor = (Color)((value == DependencyProperty.UnsetValue) ? Colors.Black : ((SolidColorBrush)value).Color);
_cmbFontColor.SelectedColor = currentColor;
}
private void UpdateFontBackgroundColor()
{
object value = Target.Selection.GetPropertyValue(TextElement.BackgroundProperty);
Color currentColor = (Color)((value == null || value == DependencyProperty.UnsetValue) ? default(Color) : ((SolidColorBrush)value).Color);
_cmbFontBackgroundColor.SelectedColor = currentColor;
}
/// <summary>
/// Updates the visual state of the List styles, such as Numbers and Bullets.
/// </summary>
private void UpdateSelectionListType()
{
//uncheck both
_btnBullets.IsChecked = false;
_btnNumbers.IsChecked = false;
Paragraph startParagraph = Target.Selection.Start.Paragraph;
Paragraph endParagraph = Target.Selection.End.Paragraph;
if (startParagraph != null && endParagraph != null && (startParagraph.Parent is ListItem) && (endParagraph.Parent is ListItem) && object.ReferenceEquals(((ListItem)startParagraph.Parent).List, ((ListItem)endParagraph.Parent).List))
{
TextMarkerStyle markerStyle = ((ListItem)startParagraph.Parent).List.MarkerStyle;
if (markerStyle == TextMarkerStyle.Disc) //bullets
{
_btnBullets.IsChecked = true;
}
else if (markerStyle == TextMarkerStyle.Decimal) //numbers
{
_btnNumbers.IsChecked = true;
}
}
}
/// <summary>
/// Checks to see if both selection lists are checked. (Bullets and Numbers)
/// </summary>
/// <returns></returns>
private bool BothSelectionListsAreChecked()
{
return _btnBullets.IsChecked == true && _btnNumbers.IsChecked == true;
}
void ApplyPropertyValueToSelectedText(DependencyProperty formattingProperty, object value)
{
if (value == null)
return;
Target.Selection.ApplyPropertyValue(formattingProperty, value);
}
private void ProcessMove(DragDeltaEventArgs e)
{
AdornerLayer layer = AdornerLayer.GetAdornerLayer(Target);
UIElementAdorner<Control> adorner = layer.GetAdorners(Target)[0] as UIElementAdorner<Control>;
adorner.SetOffsets(adorner.OffsetLeft + e.HorizontalChange, adorner.OffsetTop + e.VerticalChange);
}
#endregion //Methods
}
}