在开发WPF应用程序时,经常会遇到需要使用颜色对话框的情况。虽然WPF提供了丰富的控件和功能,但有时可能需要利用WinForms中的某些组件来实现特定的功能。本文将介绍如何在WPF项目中集成WinForms颜色对话框,并创建一个简单的文本编辑器,展示如何改变文本的前景和背景色。
在不打算设计一个用户控件或为解决方案添加额外项目的情况下,开始了广泛的搜索,寻找一个简单的解决方案,并因此创建了以下内容。这同样展示了如何在WPF解决方案中使用WinForms组件。
为了演示,创建了一个小型文本编辑器。将展示如何在RichTextBox中改变选中文本的前景/背景色。
创建一个名为TextEditor的WPF项目。
在项目中添加对System.Windows.Forms.dll和System.Drawing.dll的引用。这两个文件可以在以下目录中找到:C:\Windows\Microsoft.NET\Framework\v2.0.50727\。
在项目中添加一个名为Images的文件夹,然后添加工具栏所需的图片。
在项目中添加一个名为DocumentManager.cs的类,并添加一些方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using Microsoft.Win32;
namespace TextEditor
{
class DocumentManager
{
private string _currentFile;
private RichTextBox _textBox;
public DocumentManager(RichTextBox textBox)
{
_textBox = textBox;
}
public void ApplyToSelection(DependencyProperty property, object value)
{
_textBox.Selection.ApplyPropertyValue(property, value);
}
public bool OpenDocument()
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == true)
{
_currentFile = dlg.FileName;
using (Stream stream = dlg.OpenFile())
{
TextRange range = new TextRange(_textBox.Document.ContentStart, _textBox.Document.ContentEnd);
range.Load(stream, DataFormats.Rtf);
}
return true;
}
return false;
}
public bool SaveDocument()
{
if (string.IsNullOrEmpty(_currentFile))
return SaveDocumentAs();
else
{
using (Stream stream = new FileStream(_currentFile, FileMode.Create))
{
TextRange range = new TextRange(_textBox.Document.ContentStart, _textBox.Document.ContentEnd);
range.Save(stream, DataFormats.Rtf);
}
return true;
}
}
public bool SaveDocumentAs()
{
SaveFileDialog dlg = new SaveFileDialog();
if (dlg.ShowDialog() == true)
{
_currentFile = dlg.FileName;
return SaveDocument();
}
return false;
}
public void NewDocument()
{
_currentFile = null;
_textBox.Document = new FlowDocument();
}
}
}
下面是MainWindow.xaml的XAML代码。
<Window x:Class="TextEditor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<ToolBarTray DockPanel.Dock="top">
<ToolBar>
<Button x:Name="highlight" Click="Highlight_Click">
<Image Source="Images\text_highlight.png" />
</Button>
<Button x:Name="color" Click="Color_Click">
<Image Source="Images\text_Color.png" />
</Button>
</ToolBar>
</ToolBarTray>
<RichTextBox x:Name="body" SelectionChanged="body_SelctionChanged" SpellCheck.IsEnabled="True" AcceptsReturn="True" AcceptsTab="True" BorderThickness="0 2 0 0" />
</DockPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Forms;
namespace TextEditor
{
public partial class MainWindow : Window
{
private DocumentManager _documentManager;
public MainWindow()
{
InitializeComponent();
_documentManager = new DocumentManager(body);
}
private void body_SelctionChanged(object sender, RoutedEventArgs e)
{
// update the tool bar
}
private void Highlight_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush scb = new SolidColorBrush();
_documentManager.ApplyToSelection(TextBlock.ForegroundProperty, new SolidColorBrush(colorPicker()));
}
private void Color_Click(object sender, RoutedEventArgs e)
{
_documentManager.ApplyToSelection(TextBlock.BackgroundProperty, new SolidColorBrush(colorPicker()));
}
private System.Windows.Media.Color colorPicker()
{
System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();
colorDialog.AllowFullOpen = true;
colorDialog.ShowDialog();
System.Windows.Media.Color col = new System.Windows.Media.Color();
col.A = colorDialog.Color.A;
col.B = colorDialog.Color.B;
col.G = colorDialog.Color.G;
col.R = colorDialog.Color.R;
return col;
}
}
}