RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 919490
Accepted
Leksor
Leksor
Asked:2020-12-13 19:18:10 +0000 UTC2020-12-13 19:18:10 +0000 UTC 2020-12-13 19:18:10 +0000 UTC

在 WPF 中的 TextBox 中查找选定的文本

  • 772

有一个普通的 TextBox 用于写入文本。我需要以下内容:

我用鼠标选择了部分文本,然后单击“斜体”按钮,然后在文本选择开始之前添加 ,并<i>在选择结束时添加</i>。

问题:如何确定鼠标选择的文本以便进一步使用它?

UPD1:

我正在使用 MVVM + Catel,Catel.Fody 模型

我的观点:

<TextBox Grid.Row="2" Grid.Column="1" MaxLines="255"
                     AcceptsReturn="True"
                     AcceptsTab="True"
                     Text="{Binding Content, UpdateSourceTrigger=PropertyChanged}" TextChanged="OnTextChanged"
                     SelectedText="{Binding SelectedText, UpdateSourceTrigger=PropertyChanged}"/>

我的模型:

public ViewModel()
{
    BoldText = new Command(OnBoldText);
    ItalicText = new Command(OnItalicText);
}

public Command BoldText { get; set; }

public Command ItalicText { get; set; }

public string SelectedText { get; set; }

private void OnBoldText()
{
}

private void OnItalicText()
{
}

现在的问题是,如果我在视图中设置了一个 sv,SelecteedText那么程序中的选项卡就会停止打开。如果我删除这个 sv-in,那么一切正常。

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Leksor
    2020-12-17T16:08:33Z2020-12-17T16:08:33Z

    我用这样的触发器做到了:(查看)

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
    
        <handal:DropDownButton Grid.Column="0"
                               Header="Размер текста"
                               Margin="0,0,0,3"
                               ToolTip="Размер выделенного текста">
            <handal:DropDownButton.DropDown>
                <ContextMenu>
                    <MenuItem Header="Большой"
                              Command="{Binding FormatTextCommand}" CommandParameter="0"
                              ToolTip="Увеличить выделенный текст (big)" />
                    <MenuItem Header="Маленький"
                              Command="{Binding FormatTextCommand}" CommandParameter="1"
                              ToolTip="Уменьшить выделенный текст (small)" />
                </ContextMenu>
            </handal:DropDownButton.DropDown>
        </handal:DropDownButton>
    
        <handal:ImageButton Grid.Column="1"
                            Icon="Bold"
                            Command="{Binding FormatTextCommand}" CommandParameter="2"
                            ToolTip="Сделать выделенный текст жирным (b)" />
    
        <handal:ImageButton Grid.Column="2"
                            Icon="Italic"
                            Command="{Binding FormatTextCommand}" CommandParameter="3"
                            ToolTip="Сделать выделенный текст курсивом (i)" />
    
        <handal:ImageButton Grid.Column="3"
                            Icon="CaretDown"
                            Command="{Binding FormatTextCommand}" CommandParameter="4"
                            ToolTip="Новая строка (br)" />
    
        <handal:ImageButton Grid.Column="4"
                            Icon="Paragraph"
                            Command="{Binding FormatTextCommand}" CommandParameter="5"
                            ToolTip="Объединить выделенный текст в параграф (p)" />
    
        <handal:ImageButton Grid.Column="5"
                            Icon="Inbox"
                            Command="{Binding FormatTextCommand}" CommandParameter="6"
                            ToolTip="Объединить выделенный текст в контейнер (div)" />
    </Grid>
    
    <Label Grid.Row="2" Grid.Column="0" Content="Содержимое письма" VerticalAlignment="Top" />
    <TextBox Grid.Row="2" Grid.Column="1" MaxLines="255"
         AcceptsReturn="True"
         AcceptsTab="True"
         TextWrapping="Wrap"
         Text="{Binding Content, UpdateSourceTrigger=PropertyChanged}" TextChanged="OnTextChanged">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <catel:EventToCommand Command="{Binding TextBoxSelectionChangedCommand}"
                                      PassEventArgsToCommand="True" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>
    

    模型:

    private Command<RoutedEventArgs> _textBoxSelectionChangedCommand;
    
    public ClientsMailingViewModel()
    {
        FormatTextCommand = new Command<string>(OnFormatText);
    }
    
    public Command<string> FormatTextCommand { get; set; }
    
    public int SelectionStart { get; set; }
    
    public int SelectionLength { get; set; }
    
    public string Content { get; set; }
    
    public Command<RoutedEventArgs> TextBoxSelectionChangedCommand
    {
        get
        {
            if (_textBoxSelectionChangedCommand == null)
            {
                _textBoxSelectionChangedCommand =
                    new Command<RoutedEventArgs>((r) => TextBoxSelectionChanged(r), (r) => true);
            }
    
            return _textBoxSelectionChangedCommand;
        }
    }
    
    protected virtual void TextBoxSelectionChanged(RoutedEventArgs args)
    {
        SelectionStart = (args.OriginalSource as System.Windows.Controls.TextBox).SelectionStart;
        SelectionLength = (args.OriginalSource as System.Windows.Controls.TextBox).SelectionLength;
    }
    
    private void OnFormatText(string param)
    {
        if (!string.IsNullOrEmpty(Content))
        {
            string lastStr = "", firstStr = "";
    
            // Текст большой
            if (param == "0")
            {
                lastStr = "</big>";
                firstStr = "<big>";
            }
            // Текст маленький
            else if (param == "1")
            {
                lastStr = "</small>";
                firstStr = "<small>";
            }
            // Текст жирным
            else if (param == "2")
            {
                lastStr = "</b>";
                firstStr = "<b>";
            }
            // Текст курсивом
            else if (param == "3")
            {
                lastStr = "</i>";
                firstStr = "<i>";
            }
            // Новая строка <br>
            else if (param == "4")
            {
                lastStr = "";
                firstStr = "\n<br>";
            }
            // Параграф <p>
            else if (param == "5")
            {
                lastStr = "</p>\n";
                firstStr = "\n<p>";
            }
            // Контейнер <div>
            else if (param == "6")
            {
                lastStr = "</div>\n";
                firstStr = "\n<div>";
            }
    
            var contentTemp = Content.Insert(SelectionStart + SelectionLength, lastStr);
            contentTemp = contentTemp.Insert(SelectionStart, firstStr);
            Content = contentTemp;
        }
    }
    
    • 0
  2. Andrew_STOP_RU_AGRESSION_IN_UA
    2020-12-13T19:29:31Z2020-12-13T19:29:31Z

    尚未测试,但应该可以工作:

    txtBox.Text = txtBox.Text.Replace(txtBox.SelectedText,$"{<i>txtBox.SelectedText}</i>");
    

    您还需要考虑到,如果选择每个字母 1 个,则字符串中的每个字母实例都将被视为一个标签。因此,如果您想确保不会发生这种情况,您将需要使算法复杂化。

    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5