精华内容
下载资源
问答
  • 接着上一篇《WPF笔记汇总之杂项控件与样式》,来总结下一个WPF知识点,这篇主要汇总富文本控件与选项卡控件,包括一些常用的用法属性及相关控件样式的自定义实例。

    WPF富文本控件与标签页控件

    接着上一篇《WPF笔记汇总之杂项控件与样式》,来总结下一个WPF知识点,这篇主要汇总富文本控件与选项卡控件,包括一些常用的用法属性及相关控件样式的自定义实例。

    1. FlowDocument 控件

    就是编辑这些加载的富文本用的控件。就是FlowDocument系列控件,负责渲染富文本,这包括图片、列表、表格,以及其他可以浮动、调整等的元素。使用FlowDocument,可以在设计时像HTML一样指定富文本内容,并能直接在你的WPF应用中渲染。FlowDocument并不是单独的组件。

    1.1 FlowDocumentScrollViewer

    FlowDocument的最简单的包装,它简单地把文档显示成一份长文本文档,允许滚动浏览。可以在按住Ctrl键时使用鼠标滚轮放大和缩小。也可以在FlowDocumentScrollViewer上将IsToolBarVisible属性设置为true,显示缩放的工具栏。通过设置ScrollViewer.VerticalScrollBarVisibility属性为Auto,滚动条将被置为不可见,TextAlignment属性设置对其方式,IsOptimalParagraphEnabled属性使文本尽量在前,。 IsHyphenationEnabled 允许WPF使用连字符分割单词。

    <FlowDocumentScrollViewer>
    	<FlowDocument>
    		<Paragraph FontSize="36">Hello, world!</Paragraph>
    		<Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">The ultimate programming greeting!</Paragraph>
    	</FlowDocument>
    </FlowDocumentScrollViewer>
    
    <!--显示缩放工具栏-->
    <FlowDocumentScrollViewer IsToolBarVisible="True" Zoom="80" ScrollViewer.VerticalScrollBarVisibility="Auto">
    	<FlowDocument>
    		<Paragraph FontSize="36">Hello, world!</Paragraph>
    		<Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">The ultimate programming greeting!</Paragraph>
    	</FlowDocument>
    </FlowDocumentScrollViewer>
    
    <!--文本对齐-->
    <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
    		<FlowDocument>
    			<Paragraph FontStyle="Italic" FontSize="14" Foreground="Gray">
    				By setting the
    				<Bold>IsOptimalParagraphEnabled</Bold> property to true,
                      you will allow WPF to look ahead on the lines to come, before deciding
                      where to break. This will usually result in a more pleasant reading
                      experience. It works especially well in combination with the
    				<Bold>IsHyphenationEnabled</Bold> property.
    			</Paragraph>
    		</FlowDocument>
    	</FlowDocumentScrollViewer>
    
    <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
    	<FlowDocument IsOptimalParagraphEnabled="True" IsHyphenationEnabled="True">
    		<Paragraph FontStyle="Italic" FontSize="14" Foreground="Gray">
    			By setting the
    			<Bold>IsOptimalParagraphEnabled</Bold> property to true,
                      you will allow WPF to look ahead on the lines to come, before deciding
                      where to break. This will usually result in a more pleasant reading
                      experience. It works especially well in combination with the
    			<Bold>IsHyphenationEnabled</Bold> property.
    		</Paragraph>
    	</FlowDocument>
    </FlowDocumentScrollViewer>
    

    1.2 FlowDocumentPageViewer

    该控件会自动把你的文档分割成页,以便在页之间浏览,支持Ctrl+F键盘快捷键来启动搜索,但要确保有足够的水平控件,否则看不到搜索框

    <DockPanel>
    	<WrapPanel DockPanel.Dock="Top">
    		<Button Name="btnSearch" Click="btnSearch_Click">Search</Button>
    	</WrapPanel>
    	<FlowDocumentPageViewer Name="fdViewer">
    		<FlowDocument>
    			<Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce faucibus odio arcu, luctus vestibulum tortor congue in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec lacinia neque. Donec malesuada, ligula non vestibulum cursus, urna purus pellentesque orci, aliquet accumsan dui velit ac justo. Phasellus sagittis ligula in leo dapibus, vel vestibulum felis mattis. Fusce vitae auctor nibh. Ut sit amet fringilla turpis. Aenean tincidunt feugiat sapien, quis scelerisque enim pretium commodo. Mauris fermentum posuere nulla, vitae fermentum quam malesuada in. Cras ultrices bibendum nulla eu mollis. Sed accumsan pretium magna, non sodales velit viverra id. Sed eu elit sit amet sem ullamcorper rhoncus.</Paragraph>
    			<Paragraph>Nulla vitae suscipit tellus. Nunc sit amet tortor fermentum, sollicitudin enim cursus, sagittis lacus. Pellentesque tincidunt massa nisl, nec tempor nulla consequat a. Proin pharetra neque vel dolor congue, at condimentum arcu varius. Sed vel luctus enim. Curabitur eleifend dui et arcu faucibus, sit amet vulputate libero suscipit. Vestibulum ultrices nisi id metus ultrices, eu ultricies ligula rutrum. Phasellus rhoncus aliquam pretium. Quisque in nunc erat. Etiam mollis turpis cursus, sagittis felis vel, dignissim risus. Ut at est nec tellus lobortis venenatis. Fusce elit mi, gravida sed tortor at, faucibus interdum felis. Phasellus porttitor dolor in nunc pellentesque, eu hendrerit nulla porta. Vestibulum cursus placerat elit. Nullam malesuada dictum venenatis. Interdum et malesuada fames ac ante ipsum primis in faucibus.</Paragraph>
    		</FlowDocument>
    	</FlowDocumentPageViewer>
    </DockPanel>
    

    也可以在后置代码中调用搜索按钮

    private void btnSearch_Click(object sender, RoutedEventArgs e)
    {
    	fdViewer.Find();
    }
    

    1.3 FlowDocumentReader

    前两种控件的结合体。它有一些比较重要的属性,ViewingMode - 控制初始查看模式。 默认值为Page,但如果您需要其他默认视图,则可以将其更改为Scroll或TwoPage。 除非明确禁用,否则最终用户仍可以更改此设置。IsFindEnabled - 使您能够禁用文档中的搜索。 如果禁用,搜索按钮将从工具栏中删除。IsTwoPageViewEnabled, IsPageViewEnabled 和 IsScrollViewEnabled - 允许关闭阅读器的特定查看模式。 设置为false时,此模式不再适用于阅读器,并且该按钮将从工具栏中删除。
    Zoom - 允许设置默认缩放级别。 标准是100%,但可以使用Zoom属性更改此值。

    <Grid>
    	<FlowDocumentReader>
    		<FlowDocument>
    			<Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce faucibus odio arcu, luctus vestibulum tortor congue in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec lacinia neque. Donec malesuada, ligula non vestibulum cursus, urna purus pellentesque orci, aliquet accumsan dui velit ac justo. Phasellus sagittis ligula in leo dapibus, vel vestibulum felis mattis. Fusce vitae auctor nibh. Ut sit amet fringilla turpis. Aenean tincidunt feugiat sapien, quis scelerisque enim pretium commodo. Mauris fermentum posuere nulla, vitae fermentum quam malesuada in. Cras ultrices bibendum nulla eu mollis. Sed accumsan pretium magna, non sodales velit viverra id. Sed eu elit sit amet sem ullamcorper rhoncus.</Paragraph>
    			<Paragraph>Nulla vitae suscipit tellus. Nunc sit amet tortor fermentum, sollicitudin enim cursus, sagittis lacus. Pellentesque tincidunt massa nisl, nec tempor nulla consequat a. Proin pharetra neque vel dolor congue, at condimentum arcu varius. Sed vel luctus enim. Curabitur eleifend dui et arcu faucibus, sit amet vulputate libero suscipit. Vestibulum ultrices nisi id metus ultrices, eu ultricies ligula rutrum. Phasellus rhoncus aliquam pretium. Quisque in nunc erat. Etiam mollis turpis cursus, sagittis felis vel, dignissim risus. Ut at est nec tellus lobortis venenatis. Fusce elit mi, gravida sed tortor at, faucibus interdum felis. Phasellus porttitor dolor in nunc pellentesque, eu hendrerit nulla porta. Vestibulum cursus placerat elit. Nullam malesuada dictum venenatis. Interdum et malesuada fames ac ante ipsum primis in faucibus.</Paragraph>
    		</FlowDocument>
    	</FlowDocumentReader>
    </Grid>
    

    也可以从后置代码进行设置

    <Grid>
    	<FlowDocumentScrollViewer Name="fdViewer" />
    </Grid>
    
    public MainWindow()
    {
    	InitializeComponent();
    
    	FlowDocument doc = new FlowDocument();
    	Paragraph p = new Paragraph(new Run("Hello, world!"));
    	p.FontSize = 36;
    	doc.Blocks.Add(p);
    	
    	p = new Paragraph(new Run("The ultimate programming greeting!"));
    	p.FontSize = 14;
    	p.FontStyle = FontStyles.Italic;
    	p.TextAlignment = TextAlignment.Left;
    	p.Foreground = Brushes.Gray;
    	doc.Blocks.Add(p);
    	fdViewer.Document = doc;
    }
    

    1.4 高级FlowDocument内容

    可以在FlowDocument中包含任何WPF控件。 使用BlockUIContainer元素包含他们,就可以访问所有控件了。

    <Window.Resources>
    	<x:Array x:Key="UserArray" Type="{x:Type local:User}">
    		<local:User Name="John Doe" Age="42"/>
    		<local:User Name="Jane Doe" Age="36"/>
    	</x:Array>
    </Window.Resources>
    <Grid>
    	<FlowDocumentScrollViewer>
    		<FlowDocument>
    			<Paragraph FontSize="36" Margin="0">Users</Paragraph>
    			<Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">Here's a list of our users, inside our FlowDocument, in a completely interactive ListView control!</Paragraph>
    			<BlockUIContainer>
    				<ListView BorderThickness="0" ItemsSource="{StaticResource UserArray}">
    					<ListView.View>
    						<GridView>
    							<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="150" />
    							<GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="75" />
    						</GridView>
    					</ListView.View>
    				</ListView>
    			</BlockUIContainer>
    			<Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">More content can go here...</Paragraph>
    		</FlowDocument>
    	</FlowDocumentScrollViewer>
    </Grid>
    
    public class User
    {
    	public String Name { get; set; }
    	public int Age { get; set; }
    }
    

    2. RichTextBox 控件

    FlowDocument通常是只读的,但将其放入一个RichTextBox控件后,你就可以像在Word那样的文档编辑器上一样编辑这些文本了。比较麻烦的是,RichTextBox 不能直接访问RichTextBox的文本属性,只能使用来自RichTextBox的TextPointer的TextRange对象来获取控件中的文本或控件中的选择。此外还需要设置一下段落的间距。

    <DockPanel>
    	<WrapPanel DockPanel.Dock="Top">
    	<Button Name="btnGetText" Click="btnGetText_Click">Get text</Button>
    	<Button Name="btnSetText" Click="btnSetText_Click">Set text</Button>
    	<Button Name="btnGetSelectedText" Click="btnGetSelectedText_Click">Get sel. text</Button>
    	<Button Name="btnSetSelectedText" Click="btnSetSelectedText_Click">Replace sel. text</Button>
    	</WrapPanel>
    <TextBox DockPanel.Dock="Bottom" Name="txtStatus" />
    <RichTextBox Name="rtbEditor" SelectionChanged="rtbEditor_SelectionChanged">
    	<RichTextBox.Resources>
    		<Style TargetType="{x:Type Paragraph}">
    			<Setter Property="Margin" Value="0" />
    		</Style>
    	</RichTextBox.Resources>
    	<FlowDocument>
    			<Paragraph FontSize="36">Hello, world!</Paragraph>
    			<Paragraph FontStyle="Italic" TextAlignment="Left" FontSize="14" Foreground="Gray">Thanks to the RichTextBox control, this FlowDocument is completely editable!</Paragraph>
    	</FlowDocument>
    </RichTextBox>
    </DockPanel>
    
    

    3. TabControl 控件

    TabControl 就是标签页控件。其中TabStripPlacement 属性可以改变选项卡的位置,结合样式与模板可以改变标签选项卡的位置及标签页头文字的方向。

    3.1 常规用法

    <!--简单标签页-->
    <Grid>
    	<TabControl>
    		<TabItem Header="General">
    			<Label Content="Content goes here..." />
    		</TabItem>
    		<TabItem Header="Security" />
    		<TabItem Header="Details" />
    	</TabControl>
    </Grid>
    
    <!--自定义标题-->
    <Grid>
    	<TabControl>
    		<TabItem>
    			<TabItem.Header>
    				<StackPanel Orientation="Horizontal">
    					<Image Source="/images/file.png" />
    					<TextBlock Text="Blue" Foreground="Blue" />
    				</StackPanel>
    			</TabItem.Header>
    			<Label Content="Content goes here..." />
    		</TabItem>
    		<TabItem>
    			<TabItem.Header>
    				<StackPanel Orientation="Horizontal">
    					<Image Source="/images/file.png" />
    					<TextBlock Text="Red" Foreground="Red" />
    				</StackPanel>
    			</TabItem.Header>
    		</TabItem>
    		<TabItem>
    			<TabItem.Header>
    				<StackPanel Orientation="Horizontal">
    					<Image Source="/images/file.png" />
    					<TextBlock Text="Green" Foreground="Green" />
    				</StackPanel>
    			</TabItem.Header>
    		</TabItem>
    	</TabControl>
    </Grid>
    
    <!--控制标签页-->
    <DockPanel>
    	<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" Margin="2,5">
    		<Button Name="btnPreviousTab" Click="btnPreviousTab_Click">Prev.</Button>
    		<Button Name="btnNextTab" Click="btnNextTab_Click">Next</Button>
    		<Button Name="btnSelectedTab" Click="btnSelectedTab_Click">Selected</Button>
    	</StackPanel>
    	<TabControl Name="tcSample">
    		<TabItem Header="General">
    			<Label Content="Content goes here..." />
    		</TabItem>
    		<TabItem Header="Security" />
    		<TabItem Header="Details" />
    	</TabControl>
    </DockPanel>
    
    private void btnPreviousTab_Click(object sender, RoutedEventArgs e)
    {
    	int newIndex = tcSample.SelectedIndex - 1;
    	if (newIndex < 0)
    		newIndex = tcSample.Items.Count - 1;
    	tcSample.SelectedIndex = newIndex;
    }
    private void btnNextTab_Click(object sender, RoutedEventArgs e)
    {
    	int newIndex = tcSample.SelectedIndex + 1;
    	if (newIndex >= tcSample.Items.Count)
    		newIndex = 0;
    	tcSample.SelectedIndex = newIndex;
    }
    private void btnSelectedTab_Click(object sender, RoutedEventArgs e)
    {
    	MessageBox.Show("Selected tab: " + (tcSample.SelectedItem as TabItem).Header);
    }
    

    3.2 改变标签页方向

    
    <TabControl TabStripPlacement="Left">
    	<TabControl.Resources>
    		<Style TargetType="{x:Type TabItem}">
    			<Setter Property="HeaderTemplate">
    				<Setter.Value>
    					<DataTemplate>
    						<ContentPresenter Content="{TemplateBinding Content}">
    							<ContentPresenter.LayoutTransform>
    								<RotateTransform Angle="270" />
    							</ContentPresenter.LayoutTransform>
    						</ContentPresenter>
    					</DataTemplate>
    				</Setter.Value>
    			</Setter>
    			<Setter Property="Padding" Value="3" />
    		</Style>
    	</TabControl.Resources>
    	
    	<TabItem Header="General">
    		<Label Content="Content goes here..." />
    	</TabItem>
    	<TabItem Header="Security" />
    	<TabItem Header="Details" />
    </TabControl>
    

    标签选项卡改变位置截图

    3.3 自定义标签页

    可以通过使用Style更改ControlTemplate来实现自定义的样式。 通过添加ContentPresenter 控件,指定TabItem的内容应放在何处。

    <Grid>
        <TabControl Margin="10" BorderBrush="Gainsboro">
            <TabControl.Resources>
                <Style TargetType="TabItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="TabItem">
                                <Border Name="Border" BorderThickness="1,1,1,0" BorderBrush="Gainsboro" CornerRadius="4,4,0,0" Margin="2,0">
                                    <ContentPresenter x:Name="ContentSite"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Center"
                                        ContentSource="Header"
                                        Margin="10,2"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Border" Property="Background" Value="LightSkyBlue" />
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="False">
                                        <Setter TargetName="Border" Property="Background" Value="GhostWhite" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </TabControl.Resources>
            <TabItem Header="General">
                <Label Content="Content goes here..." />
            </TabItem>
            <TabItem Header="Security" />
            <TabItem Header="Details" />
        </TabControl>
    </Grid>
    
    • 效果运行截图
      自定义TabControl
    展开全文
  • 我用WPF编写了一个富文本编辑器,但有两个问题不能解决,望各位前辈指点!1.textEditor.xaml前台代码如下:xmlns=...

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

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

    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">

    SmallImageSource="ico/Notepad.png"

    LargeImageSource="ico/Notepad.png"

    ToolTipTitle="WPF4 Notepad"

    ToolTipDescription="Notepad Application with Ribbon Sample" />

    LabelTitle="字体"

    CanExecute="FontStyleCommand_CanExecute"

    Executed="FontStyleCommand_Executed"

    ToolTipTitle="FontStyle"

    ToolTipDescription="FontStyle selected contents"

    />

    Command="{StaticResource FontColorCommand}">

    CanExecute="FontColorComboBox_CanExecute"

    Executed="FontColorComboBox_Executed"

    ToolTipTitle="FontColor"

    ToolTipDescription="FontColor selected contents" />

    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

    {

    ///

    /// textEditorControl.xaml 的交互逻辑

    ///

    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容器的颜色是,通过后台代码可将所选的文字颜色进行相应的改变。但是当我选择颜色后程序无法运行。

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

    展开全文
  • WPF富文本编辑器

    2016-05-15 21:26:20
    使用WPF中的RichTextBox控件自定义的文本编辑器,具备文本字体、字体大小、颜色、背景色、加粗、斜线等基本功能
  • 基本的文本编辑,查看Html源码、打印、导出文本文件、插入图片、插入表格等,可作为参考使用
  • WPF富文本RichTextBox用法

    千次阅读 2018-06-21 14:45:49
    1.加载文本 /// &lt;summary&gt; /// 加载文本 /// &lt;/summary&gt; /// &lt;param name="filename"&gt;&lt;/param&gt; private void LoadFile(string filename,...

    1.加载文本


            /// <summary>
            /// 加载文本
            /// </summary>
            /// <param name="filename"></param>
            private void LoadFile(string filename,RichTextBox   richTextBox)
            {
                if (string.IsNullOrEmpty(filename))
                {
                    throw new ArgumentNullException();
                }
                if (!File.Exists(filename))
                {
                    throw new FileNotFoundException();
                }
                using (FileStream stream = File.OpenRead(filename))
                {
                    TextRange documentTextRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
                    string dataFormat = DataFormats.Text;
                    StreamReader sr = new StreamReader(stream, Encoding.Default);
                    documentTextRange.Load(new MemoryStream(Encoding.UTF8.GetBytes(sr.ReadToEnd())), dataFormat);

                }

            }

    防止中文乱码:

            StreamReader sr = new StreamReader(stream, Encoding.Default);

            new MemoryStream(Encoding.UTF8.GetBytes(sr.ReadToEnd()))


    2.读取文本

             TextRange documentTextRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);

                return Encoding.UTF8.GetBytes(documentTextRange.Text);

    待续。。。。。。



    展开全文
  • 最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单。 richtextbox 类似于Word,是一个可编辑的控件。结构图(来自网络) 我的主要...

    最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单。

    richtextbox 类似于Word,是一个可编辑的控件。结构图(来自网络)

    我的主要用途是用来支持一个基于C#的考试系统,由于考试科目涉及到图片以及还有复杂的数学公式,所以,传统的textbox控件是不能同时支持图片和文字以及rtf格式的类型的,而richtextbox恰好可以支持。

    难点1、 添加试题,将带有格式的文本输入进richtextbox,并存到数据库中。

    二进制 

    这种带格式的文本内容是不能直接存到数据库中的,所以必须将其内容进行转换,转换成数据库支持的格式,首先就是想到了二进制,经过实践,通过将其内容转换成二进制文件是可以保存到数据库中的,但是存在一个问题,就是程序运行时,将带有图片的文本内容存到数据库中后,本次运行的过程中是可以读取出来的,但是关闭程序后, 再次运行,就会出现路径错误的错误。

    base64String 

    经过一番探索,发现可以将其内容转换成base64String的格式,然后在存到数据库就可以实现自由存取。所以创建了以下的方法,用来将richtextbox中的内容转换成数据库可存储的格式

    using System.IO;
    //将富文本控件的内容转换成string类型
            public string GetTextByRichBox(RichTextBox box)
            {
                //创建一个流
                MemoryStream s = new MemoryStream();
                //获得富文本中的内容
                TextRange documentTextRange = new TextRange(box.Document.ContentStart, box.Document.ContentEnd);
                //将富文本中的内容转换成xaml的格式,并保存到指定的流中
                documentTextRange.Save(s, DataFormats.XamlPackage);
                //将流中的内容转换成字节数组,并转换成base64的等效格式
                return Convert.ToBase64String(s.ToArray());
            }

    将数据库中的数据转换回richtextbox可是别的内容的方法如下:

    /// <summary>
            /// 将数据库中的内容转换回richtextbox可识别的内容
            /// </summary>
            /// <param name="data">数据库取出的数据</param>
            /// <param name="box">接收的richtextbox控件名称</param>
            public void ShowTextToRichBox(string data,RichTextBox box)
            {
                MemoryStream s = new MemoryStream((Convert.FromBase64String(Convert.ToString(data))));
                TextRange TR = new TextRange(box.Document.ContentStart, box.Document.ContentEnd);
                TR.Load(s, DataFormats.XamlPackage);
            }

     

    展开全文
  • 可以发邮 件??? https://ww w.evget.com/article/2014/3/25/20723.html 转载于:https://www.cnblogs.com/buchizaodian/p/7283336.html
  • WPF的基本控件

    2021-08-06 15:42:00
    WPF控件有很多,接下来给大家介绍一下:1.Border放到其他控件内部,给其他控件画边框,其他容器必须支持双标签。 2.Button按钮,按钮用图片应该设置内容为Image,而不能设置Background为Image,如果只设置背景,...
  • WPF各种基本控件模版

    2016-08-24 09:38:05
    TextBox样式包括:水印、富文本格式、密码框、只读、搜索、选择文件路径 Button样式:鼠标移上去变色、图标+文字、勾选 Loading样式:仿VS2015的等待动画、原型进度条 Image样式:转动 ComboBox样式:水印、日历、...
  • 其中的 win 是弹框选择的图片信息,mainRTB是富文本控件 常规的保存是不支持图片的保存的,所以我们要换个格式保存,代码如下 ///  /// 保存文件.XamlPackage(支持图片保存)  ///  /// ...
  • WPF常用控件

    2021-08-30 18:41:00
    WPF中的控件可分为很多种类 控件常用通用属性 visibility 控件是否可见(默认可见)可设置...text 文本控件 isreadonly 是否只读(允许修改) textwarpping 单多行文本框(warp多行 nowarp单行文本框) maxlengt..
  • WPF语法高亮控件AvalonEdit

    万次阅读 2015-02-03 15:17:31
    AvalonEdit是基于WPF的可扩展的文本编辑器。
  • 我认为VirtualizingStackPanel控件是一个很好的工具来管理它。我在这里找到了一个描述VirtualizingStackPanel实现的系列文章。显然,这意味着将消息缓冲区维护在单独的数据结构中。编辑:我刚刚意识到标准的ListBox...
  • 祝大家端午节安康!WPF开发者QQ群:340500857前言 有小伙伴需要实现类似微信一样的气泡聊天emoji表情+文本。欢迎转发、分享、点赞,谢谢大家~。效果预览(更...
  • WPF基本控件

    2021-08-09 19:07:38
    以下是关于WPF的基本控件,和作用 Border放到其他控件内部,给其他控件画边框,其他容器必须支持双标签。 Button按钮,按钮用图片应该设置内容为Image,而不能设置Background为Image,如果只设置背景,按钮鼠标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 647
精华内容 258
关键字:

wpf富文本控件