Как динамически изменять размер изображения в RichTextBox с событием или масштабированием

Как изменить размер изображение в 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>

пожалуйста, может кто-нибудь помочь. Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенном ниже примере показано, как размер всех изображений в текущем выделении увеличивается на 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);
        }
    }
}

как вы вставили изображение в richtextbox, я использую BitmapImage, я думаю, что это немного по-другому, спасибо @Jackdaw.

Kalo 15.05.2022 11:37

@Kalo: Для тестирования кода я просто делаю Копировать вставить фрагмент текста из MS Word в RichTextBox. Затем каждый щелчок по изображению меняет его размер.

Jackdaw 15.05.2022 12:28

@Kalo Какова твоя цель? Вы хотите загрузить изображение из файла, вставить в текущий RichTextBox документ и изменить размер этого изображения? Я добавил метод public static void LoadImage(this RichTextBox rtb), который можно использовать для загрузки изображения из файла и добавления изображения в документ в RichTextBox.

Jackdaw 15.05.2022 20:46

Я программирую текстовый редактор в формате RTF. У меня есть метод вставки изображения, и я хочу отформатировать изображение. Изменение направления работает, тогда я хочу манипулировать размером. @Галка

Kalo 15.05.2022 23:05

@Kalo: Это означает, что у вас уже есть ссылка на объект Image, и вы можете просто изменить свойства Image.Height и Image.Width, чтобы изменить размер изображения. Верно?

Jackdaw 15.05.2022 23:22

Да, я могу изменить размер, но не динамически. BitmapImage.DecodePixelHeight = 200; BitmapImage.DecodePixelWidth = 200; . @Галка

Kalo 15.05.2022 23:26

@Kalo: Что значит не динамически? У вас есть метод FindImages() в приведенном выше коде. Этот метод может вернуть вам список всех изображений IList<Image> в файле RichTextBox. И вы можете изменить свойства Image.Height и Image.Width для любого изображения в документе во время выполнения.

Jackdaw 15.05.2022 23:38

извините, я не видел вашего обновления LoadImage. Я имею в виду изменение во время выполнения, например, увеличение и уменьшение размера с помощью события щелчка. @Галка

Kalo 16.05.2022 10:04

@Kalo: В моем ответе выше есть заголовок ОБНОВЛЕНО:. После названия вы можете увидеть метод LoadImage(). Этот метод является ответом на ваш вопрос "как вы вставили изображение в RichTextBox"?.

Jackdaw 16.05.2022 14:58

Да, это то, что я имел в виду. Извините, я здесь новенький и не видел обновления. Я добавил два события щелчка вместо SelectionChanged, чтобы увеличить и уменьшить размер изображения. Проблема решена. Благодарю. @Галка

Kalo 16.05.2022 22:08

Другие вопросы по теме