Diskuze: WPF RichTextBox

C# .NET .NET (C# a Visual Basic) WPF RichTextBox American English version English version

Avatar
Majkel
Člen
Avatar
Majkel:

Ahoj, dělám si jednoduchý textový editor za pomoci RichTextBoxu. Mám problém s tím, že když aplikaci spustím, zvolím si velikost písma např. 36, tak první písmenko, které nepíšu má jinou velikost a až to druhé se napíše velikostí 36. Díky za rady :-)

http://www.itnetwork.cz/dev-lighter/504
http://www.itnetwork.cz/dev-lighter/505

Editováno 9.2.2015 10:12
 
Odpovědět 9.2.2015 10:10
Avatar
Odpovídá na Majkel
Jakub Lásko[Saarix]:

Hod sem kód jak tu velikost nastavuješ či zda to mas jako property u rich boxu.

Nahoru Odpovědět 9.2.2015 11:53
Časem je vše možné.
Avatar
Majkel
Člen
Avatar
Majkel:

XAML

<Window x:Class="MyWpfTextEditor.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">
    <Grid>
        <RichTextBox x:Name="rtBox" HorizontalAlignment="Left" Height="264" Margin="10,45,0,0" VerticalAlignment="Top" Width="323" TextChanged="rtBox_TextChanged" Loaded="rtBox_Loaded"/>
        <ComboBox x:Name="fontSizeComBox" SelectedIndex="4" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="50" Loaded="fontSizeComBox_Loaded" SelectionChanged="fontSizeComBox_SelectionChanged"/>
        <ComboBox x:Name="fontNameComBox" SelectedIndex="9" HorizontalAlignment="Left" Margin="65,10,0,0" VerticalAlignment="Top" Width="230" SelectionChanged="fontNameComBox_SelectionChanged" Loaded="fontNameComBox_Loaded"/>
        <ToggleButton x:Name="boldToggButt" Content="B" FontWeight="Bold" Width="22" Height="22" Margin="300,10,192,287" Checked="boldToggButt_Checked" Unchecked="boldToggButt_Unchecked" />
        <ToggleButton x:Name="italicToggButt" Content="I" FontStyle="Italic" Width="22" Height="22" Margin="328,10,167,287" Checked="italicToggButt_Checked" Unchecked="italicToggButt_Unchecked"/>
        <ToggleButton x:Name="underToggButt" Width="22" Height="22" Margin="355,10,140,287" Checked="underToggButt_Checked" Unchecked="underToggButt_Unchecked">
            <ToggleButton.Content>
                <TextBlock>
                    <Underline>U</Underline>
                </TextBlock>
            </ToggleButton.Content>
        </ToggleButton>

    </Grid>
</Window>

A CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;

namespace MyWpfTextEditor
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void rtBox_Loaded(object sender, RoutedEventArgs e)
        {
            rtBox.AcceptsTab = true;
            rtBox.AcceptsReturn = true;
            rtBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
        }

        //Nastavení velikosti fontu
        private void fontSizeComBox_Loaded(object sender, RoutedEventArgs e)
        {
            fontSizeComBox.ItemsSource = new List<double>() { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 };
        }

        private void fontSizeComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontSizeProperty, fontSizeComBox.SelectedValue.ToString());
            rtBox.Focus();
        }

        //Nastavení typu fontu
        private void fontNameComBox_Loaded(object sender, RoutedEventArgs e)
        {
            fontNameComBox.ItemsSource = Fonts.SystemFontFamilies.OrderBy(f => f.Source);
        }

        private void fontNameComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontFamilyProperty, fontNameComBox.SelectedItem);
            rtBox.Focus();
        }

        //Nastavení RichTextBoxu
        private void rtBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontSizeProperty, fontSizeComBox.SelectedValue.ToString());
            rtBox.Selection.ApplyPropertyValue(Inline.FontFamilyProperty, fontNameComBox.SelectedItem);

            //Bold Button
            if (boldToggButt.IsChecked.Value)
            {
                rtBox.Selection.ApplyPropertyValue(Inline.FontWeightProperty, FontWeights.Bold);
            }
            else
            {
                rtBox.Selection.ApplyPropertyValue(Inline.FontWeightProperty, FontWeights.Normal);
            }

            //Italic Button
            if (italicToggButt.IsChecked.Value)
            {
                rtBox.Selection.ApplyPropertyValue(Inline.FontStyleProperty, FontStyles.Italic);
            }
            else
            {
                rtBox.Selection.ApplyPropertyValue(Inline.FontStyleProperty, FontStyles.Normal);
            }

            //Underline Button
            if (underToggButt.IsChecked.Value)
            {
                rtBox.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, TextDecorations.Underline);
            }
            else
            {
                rtBox.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, null);
            }
        }

        //Nastavení Bold Button
        private void boldToggButt_Checked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontWeightProperty, FontWeights.Bold);
        }

        private void boldToggButt_Unchecked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontWeightProperty, FontWeights.Normal);
        }

        //Nastavení Italic Button
        private void italicToggButt_Checked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontStyleProperty, FontStyles.Italic);
        }

        private void italicToggButt_Unchecked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.FontStyleProperty, FontStyles.Normal);
        }

        //Nastavení Underline Button
        private void underToggButt_Checked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, TextDecorations.Underline);
        }

        private void underToggButt_Unchecked(object sender, RoutedEventArgs e)
        {
            rtBox.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, null);
        }
    }
}
 
Nahoru Odpovědět 9.2.2015 14:14
Avatar
Odpovídá na Majkel
sadlomaslox25:

no mas to proste blbe no xD
property Selected je oznaceny text, takze kdyz menis velikost nad selected a nic neni vybrane tak to proste nefunguje.
zkusil bych predelat vsechny metody na neco takoveho:

private void fontSizeComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (rtBox.Selection.IsEmpty)
            {
                var r = new Run() {FontSize = (double) fontSizeComBox.SelectedValue};
                (rtBox.Document.Blocks.FirstBlock as Paragraph).Inlines.Add(r);
                rtBox.CaretPosition = r.ElementStart;
            }
            else
                rtBox.Selection.ApplyPropertyValue(Inline.FontSizeProperty, fontSizeComBox.SelectedValue.ToString());
            rtBox.Focus();
        }

btw tohle funguje pro zmenu velikosti

 
Nahoru Odpovědět 9.2.2015 21:28
Avatar
Majkel
Člen
Avatar
Odpovídá na sadlomaslox25
Majkel:

Ahoj, takže když to upravím, jak jsi psal, tak se mi to stejně pořád chová divně. Občas se označený text vůbec neupraví, občas mi to změní celý řádek na stejnou velikost, i když je označený jen kousek. Prošel jsem už několik článků a návodů s kompletním řešením, které když jsem si zkopíroval, tak nakonec taky nefungovalo. Už pomalu nevím, co s tím.

 
Nahoru Odpovědět 10.2.2015 15:20
Avatar
Odpovídá na Majkel
sadlomaslox25:

a upravil si odpovidajicim zpusobem i ostatni metody jako textChange/fon­tChange/boldChan­ge? ...

 
Nahoru Odpovědět 10.2.2015 15:57
Avatar
Majkel
Člen
Avatar
Odpovídá na sadlomaslox25
Majkel:

Buttony zatím neupravuju, až vyřeším to hlavní.

private void rtBox_TextChanged(object sender, TextChangedEventArgs e)

Mám upravit stejně jako

private void fontSizeComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

?

 
Nahoru Odpovědět 10.2.2015 16:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.