Как изменить размер изображение в RichTextBox. Существуют ли специальные мероприятия для этого?
вот мой код, как вставить изображение в richtextbox.
private void insetImage_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Bilder (*.png;*.jpg;*.jpeg)|*.png;*.jpg;*.jpeg";
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() == true)
{
var clipboardData = Clipboard.GetDataObject();
//BitmapImage bitmapImage = new BitmapImage(new Uri(openFileDialog.FileName, UriKind.Absolute));
Uri uri = new Uri(openFileDialog.FileName, UriKind.Absolute);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = uri;
bitmapImage.DecodePixelHeight = 200;
bitmapImage.DecodePixelWidth = 200;
bitmapImage.EndInit();
Clipboard.SetImage(bitmapImage);
richtxtbox.Paste();
Clipboard.SetDataObject(clipboardData);
}
}
Я сделал его статичным здесь, но я хочу, чтобы он был динамическим во время выполнения.
BitmapImage.DecodePixelHeight = 200;
BitmapImage.DecodePixelWidth = 200;
вот это RichTextBox
<RichTextBox Grid.Row = "2"
x:Name = "richtxtbox"
BorderBrush = "#FFF1EDED"
Block.LineHeight = "2"
Padding = "2 5"
SpellCheck.IsEnabled = "True"
ScrollViewer.VerticalScrollBarVisibility = "Visible"
SelectionChanged = "txtEditor_SelectionChanged">
</RichTextBox>
пожалуйста, может кто-нибудь помочь. Спасибо
В приведенном ниже примере показано, как размер всех изображений в текущем выделении увеличивается на 25%.
using System.Windows;
using System.Windows.Controls;
namespace WpfApp17
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void rtb_SelectionChanged(object sender, RoutedEventArgs e)
{
if (sender is RichTextBox rtb && !rtb.Selection.IsEmpty)
{
foreach (Image image in rtb.Selection.FindImages())
{
image.Width *= 1.25;
image.Height *= 1.25;
}
}
}
}
}
Метод расширения, используемый для извлечения списка изображений в текущем выборе:
using System.Windows.Documents;
using System.Windows.Controls;
using System.Collections.Generic;
namespace WpfApp17
{
public static class TextRangeExt
{
public static IList<Image> FindImages(this TextRange range)
{
IList<Image> images = new List<Image>();
for (var position = range.Start;
position != null && position.CompareTo(range.End) <= 0;
position = position.GetNextContextPosition(LogicalDirection.Forward))
{
if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementStart
&& position.GetAdjacentElement(LogicalDirection.Forward) is InlineUIContainer uic && uic.Child is Image img)
{
images.Add(img);
}
}
return images;
}
}
}
xaml
:
<Window x:Class = "WpfApp17.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
Title = "MainWindow" Height = "350" Width = "500">
<Grid>
<RichTextBox Name = "rtb1" SelectionChanged = "rtb_SelectionChanged" Background = "LightGray" Foreground = "Black">
<FlowDocument>
</FlowDocument>
</RichTextBox>
</Grid>
</Window>
ОБНОВЛЕНО:
Следующий метод LoadImage()
можно использовать для загрузки изображения из файла и добавления его в документ в RichTextBox.
public static class RichTextBoxExt
{
public static void LoadImage(this RichTextBox rtb)
{
var image = new Image();
// Select an Image file
var dlg = new OpenFileDialog
{
Filter = "Image Files(*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif|All files (*.*)|*.* "
};
if (dlg.ShowDialog() == true)
{
var imgsrc = new BitmapImage();
imgsrc.BeginInit();
imgsrc.StreamSource = File.Open(dlg.FileName, FileMode.Open);
imgsrc.EndInit();
image.Source = imgsrc;
// Set required image size
image.Height = 200;
image.Width = 200;
// Add an selected image to the document
var para = new Paragraph();
para.Inlines.Add(image);
rtb.Document.Blocks.Add(para);
}
}
}
@Kalo: Для тестирования кода я просто делаю Копировать вставить фрагмент текста из MS Word в RichTextBox
. Затем каждый щелчок по изображению меняет его размер.
@Kalo Какова твоя цель? Вы хотите загрузить изображение из файла, вставить в текущий RichTextBox
документ и изменить размер этого изображения? Я добавил метод public static void LoadImage(this RichTextBox rtb)
, который можно использовать для загрузки изображения из файла и добавления изображения в документ в RichTextBox.
Я программирую текстовый редактор в формате RTF. У меня есть метод вставки изображения, и я хочу отформатировать изображение. Изменение направления работает, тогда я хочу манипулировать размером. @Галка
@Kalo: Это означает, что у вас уже есть ссылка на объект Image
, и вы можете просто изменить свойства Image.Height
и Image.Width
, чтобы изменить размер изображения. Верно?
Да, я могу изменить размер, но не динамически. BitmapImage.DecodePixelHeight = 200; BitmapImage.DecodePixelWidth = 200; . @Галка
@Kalo: Что значит не динамически? У вас есть метод FindImages()
в приведенном выше коде. Этот метод может вернуть вам список всех изображений IList<Image>
в файле RichTextBox
. И вы можете изменить свойства Image.Height
и Image.Width
для любого изображения в документе во время выполнения.
извините, я не видел вашего обновления LoadImage. Я имею в виду изменение во время выполнения, например, увеличение и уменьшение размера с помощью события щелчка. @Галка
@Kalo: В моем ответе выше есть заголовок ОБНОВЛЕНО:. После названия вы можете увидеть метод LoadImage()
. Этот метод является ответом на ваш вопрос "как вы вставили изображение в RichTextBox"?.
Да, это то, что я имел в виду. Извините, я здесь новенький и не видел обновления. Я добавил два события щелчка вместо SelectionChanged, чтобы увеличить и уменьшить размер изображения. Проблема решена. Благодарю. @Галка
как вы вставили изображение в richtextbox, я использую BitmapImage, я думаю, что это немного по-другому, спасибо @Jackdaw.