none
WPF 富文本编辑器如何加入字体包等问题 RRS feed

  • 问题

  • 我用WPF编写了一个富文本编辑器,但有两个问题不能解决,望各位前辈指点!

    1.textEditor.xaml前台代码如下:                        

    <UserControl x:Class="Shanzhizi.Controls.TextEditor.textEditor"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                    xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
                    xmlns:fluent="clr-namespace:Fluent;assembly=Fluent"
                    xmlns:extwpftoolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended"
                    mc:Ignorable="d" d:DesignHeight="730" d:DesignWidth="1354"
                    HorizontalAlignment="Left" VerticalAlignment="Top">

        <UserControl.Resources>
            <ResourceDictionary Source="textEditorDictionary.xaml" />
        </UserControl.Resources>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="690"/>
            </Grid.RowDefinitions>

            <Grid Grid.Row="0">
                <ribbon:Ribbon x:Name="ribbon" FocusManager.IsFocusScope="True" Focusable="False" ><!--IsMinimized="True"-->
                    <ribbon:Ribbon.Resources>
                        <ribbon:RibbonCommand x:Key="AppMenuCommand" LabelTitle="Application Button"
                                SmallImageSource="ico/Notepad.png"
                                LargeImageSource="ico/Notepad.png"
                                ToolTipTitle="WPF4 Notepad" 
                                ToolTipDescription="Notepad Application with Ribbon Sample" />
                    </ribbon:Ribbon.Resources>

                    <ribbon:RibbonTab x:Name="start" Label="开始">

                            <ribbon:RibbonGroup>

                              <ribbon:RibbonGroup.Resources>

                            <ribbon:RibbonCommand x:Key="FontStyleCommand" LabelTitle="字体"

                            CanExecute="FontStyleCommand_CanExecute"
                            Executed="FontStyleCommand_Executed"
                            ToolTipTitle="FontStyle" 
                            ToolTipDescription="FontStyle selected contents" />
                            </ribbon:RibbonGroup.Resources>
                            <ribbon:RibbonComboBox Width="80" Command="{StaticResource FontStyleCommand}" x:Name="fontstylecombobox" >
                            </ribbon:RibbonComboBox>

                             

                           <ribbon:RibbonGroup  HasDialogLauncher="True" x:Name="fontcolor" Command="{StaticResource FontColorCommand}">
                            <ribbon:RibbonGroup.Resources>
                                <ribbon:RibbonCommand x:Key="FontColorComboBox" LabelTitle="字体颜色"
                            CanExecute="FontColorComboBox_CanExecute"
                            Executed="FontColorComboBox_Executed"
                            ToolTipTitle="FontColor" 
                            ToolTipDescription="FontColor selected contents" />
                            </ribbon:RibbonGroup.Resources>
                            <ribbon:RibbonComboBox x:Name="fontcolorcombobox" Width="80" Command="{StaticResource FontColorComboBox}">                        </ribbon:RibbonComboBox>
                        </ribbon:RibbonGroup>


                        </ribbon:RibbonGroup>
                    </ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="pagelayout" Label="页面布置"></ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="quote" Label="引用"></ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="email" Label="邮件"></ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="vetting" Label="审阅"></ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="view" Label="视图"></ribbon:RibbonTab>
                    <ribbon:RibbonTab x:Name="help" Label="帮助"></ribbon:RibbonTab>
                </ribbon:Ribbon>
            </Grid>

            <RichTextBox x:Name="richtextbox" Grid.Row="1"    HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Visible" Width="Auto"  FontSize="20" Margin="0,0,0,6"></RichTextBox>

        </Grid>
    </UserControl>

    2.textEditor.xaml.cs 后台代码:

           

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;


    ///引入控件
    ///using Xceed.Wpf.Toolkit;
    using Microsoft.Windows.Controls.Ribbon;
    using Fluent;
    using Microsoft.WindowsAPICodePack.Dialogs;
    using Microsoft.WindowsAPICodePack.Shell;
    using Microsoft.Win32;
    using System.IO;
    using System.Reflection;
    using System.Xml.Linq;
    using System.Resources;
    using System.Windows.Resources;
    using System.Threading;
    using System.Windows.Controls.Primitives;


    namespace Shanzhizi.Controls.TextEditor
    {
        /// <summary>
        /// textEditorControl.xaml 的交互逻辑
        /// </summary>
        public partial class textEditor : UserControl
        {
            public textEditor()
            {
                InitializeComponent();
                #region 加载字体颜色
                fontColorComboBox();
                #endregion 加载字体颜色
            }

            #region RibbonTab
            #region RibbonTab 开始
            #region RibbonTab 开始 字体

          
            private void FontStyleCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
            {

            }
            private void FontStyleCommand_Executed(object sender, ExecutedRoutedEventArgs e)
            {

            }

                    

            #region  RibbonTab 字体 设置颜色
              public void fontColorComboBox()
              {
                  PropertyInfo[] props = typeof(Colors).GetProperties();
                  foreach (PropertyInfo prop in props)
                  {
                      Color clr = (Color)prop.GetValue(null, null);
                      bool isBlack = .222 * clr.R + .707 * clr.G + .071 * clr.B > 128;
                      Label label = new Label();
                      label.Content = prop.Name;
                      label.Background = new SolidColorBrush(clr);
                      label.Foreground = isBlack ? Brushes.Black : Brushes.White;
                      label.Width = 80;
                      label.Margin = new Thickness(0, 0, 0, 0);
                      label.Tag = clr;
                      // CanvasBackgroundListBoxColor.Items.Add(label);
                      fontcolorcombobox.Items.Add(label);
                  }
              }
              private void FontColorComboBox_CanExecute(object sender, CanExecuteRoutedEventArgs e)
              {
                  if (richtextbox != null && richtextbox.Selection.Text.Length > 0)
                  {
                      e.CanExecute = true;
                  }  
              }
              private void FontColorComboBox_Executed(object sender, ExecutedRoutedEventArgs e)
              {
                  if (richtextbox != null && richtextbox.Selection.Text.Length > 0)
                  {
                     // var label = fontcolorcombobox.SelectedItem as Label;
                     // if (label != null)
                     // {
                     //    var fontcolor = label.Background as SolidColorBrush;
                     //richtextbox.Selection.ApplyPropertyValue(Run.ForegroundProperty, (fontcolorcombobox.SelectedItem as Label).Background.ToString());
                     //}
                  }
              }

            #endregion  RibbonTab 字体 设置颜色


            #endregion RibbonTab 字体

           #endregion RibbonTab
          }
        }

    以上是我编写的代码,为方便开我将其他无关代码删除:

    第一个问题:加下划线的代码,该RibbonComboBox容器是用来放置字体的容器,RibbonComboBoxItem可以放置各种文本字体,但是当有很多字体时,前台代码显得比价笨重,却相当繁琐。现在在该工程目录下有一个Fonts的文字字体文件包,其中放置上百个文字字体文件,现在我想通过后台代码将该字体Fonts文件中的字体文件自动加载到前台RibbonComboBox容器中,形成RibbonComboBoxItem子项,并显示在RibbonComboBox中,当选择RibbonComboBoxItem的字体样式时,通过后台代码可将选中的文字变为相应的字体样式。

    要实现这样的功能,后台代码该如何补写?希望前辈尽可能在现有基础上补写代码。

    第二个问题:黑体代码。该RibbonComboBox容器是用来放置字体颜色的容器,我已经通过后台代码在该RibbonComboBox容器放入了很多颜色,代码实现如上加黑及下划线部分,并已成功宣示。当我选择该RibbonComboBox容器的颜色是,通过后台代码可将所选的文字颜色进行相应的改变。但是当我选择颜色后程序无法运行。

    我要实现文本字体颜色的变化我该如何改写代码的功能实现部分(该部分已被注解),或是该代码有问题,如果有问题我应该怎样做,希望前辈尽可能在现有基础上补写代码或修改代码。

    2013年1月6日 17:13