【问题标题】:Create WPF richtextbox dynamically动态创建 WPF 富文本框
【发布时间】:2014-05-05 17:14:16
【问题描述】:

我有一个具有基本文本编辑器功能的应用程序。我使用 System.Windows.Controls Richtextbox 来打开文件。目前我的应用程序一次只能打开一个文件。但是我想增强应用程序以在多个选项卡中打开多个文件。如何实现多标签功能?我对 WPF 框架很陌生。感谢任何帮助。我的代码如下:

<Window x:Class="Editor.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  Title="Pattern Editor" Height="400" Width="600"
    >
    <Grid>

        <!-- Set the styles for the tool bar. -->
        <Grid.Resources>
            <Style TargetType="{x:Type Button}" x:Key="formatTextStyle">
                <Setter Property="FontFamily" Value="Palatino Linotype"></Setter>
                <Setter Property="Width" Value="30"></Setter>
                <Setter Property="FontSize" Value ="14"></Setter>
                <Setter Property="CommandTarget" Value="{Binding ElementName=mainRTB}"></Setter>
            </Style>

            <Style TargetType="{x:Type MenuItem}" x:Key="formatImageStyle">
                <Setter Property="Width" Value="30"></Setter>
                <Setter Property="CommandTarget" Value="{Binding ElementName=mainRTB}"></Setter>
            </Style>
        </Grid.Resources>
        <DockPanel Name="mainPanel" >
            <Menu DockPanel.Dock="Top">
                <MenuItem Header="_File">
                    <MenuItem Header="_New" Click="New_Click"/>
                    <Separator />
                    <MenuItem Header="_Open" Click="Open_Click"/>
                    <Separator />
                    <MenuItem Header="_Save" Command="ApplicationCommands.Save" ToolTip="Save" Click="Save_Click">
                        <MenuItem.Icon>
                            <Image Source="C:\Users\Documents\Visual Studio 2012\Projects\Editor\Editor\Images\FileSave.png" Height="21"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="_Save As" Click="Save_As_Click">
                        <MenuItem.Icon>
                            <Image Source="C:\Users\Documents\Visual Studio 2012\Projects\Editor\Editor\Images\FileSaveAs.png" Height="21"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <Separator />
                    <MenuItem Header="_Close" Click="Close_Click"/>
                    <Separator />
                    <MenuItem Header="_Exit" Click="Exit_Click"/>
                </MenuItem>
                <MenuItem Header="_Edit">
                    <MenuItem Header="_Cut" Command="ApplicationCommands.Cut" ToolTip="Cut">
                        <MenuItem.Icon>
                            <Image Source="C:\Users\Documents\Visual Studio 2012\Projects\Editor\Editor\Images\EditCut.png" Height="21"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="_Copy" Command="ApplicationCommands.Copy" ToolTip="Copy">
                        <MenuItem.Icon>
                            <Image Source="C:\Users\stambi\Documents\Visual Studio 2012\Projects\PatternEditor\PatternEditor\Images\EditCopy.png" Height="21"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                <MenuItem Header="_Paste" Command="ApplicationCommands.Paste" ToolTip="Paste">
                    <MenuItem.Icon>
                        <Image Source="C:\Users\Documents\Visual Studio 2012\Projects\Editor\Editor\Images\EditPaste.png" Height="21"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Undo" Command="ApplicationCommands.Undo" ToolTip="Undo">
                <MenuItem.Icon>
                    <Image Source="C:\Users\stambi\Documents\Visual Studio 2012\Projects\PatternEditor\PatternEditor\Images\EditUndo.png" Height="21"></Image>
                </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Redo" Command="ApplicationCommands.Redo" ToolTip="Redo">
                <MenuItem.Icon>
                    <Image Source="C:\Users\Documents\Visual Studio 2012\Projects\Editor\Editor\Images\EditRedo.png" Height="21"></Image>
                </MenuItem.Icon>
                </MenuItem>
                </MenuItem>
                <MenuItem Header="_Tools">
                    <MenuItem Header="_DisplayFormat">
                        <MenuItem Header="_Binary" IsCheckable="True"/>
                        <MenuItem Header="_Hexadecimal" IsCheckable="True"/>
                    </MenuItem>
                    <MenuItem Header="_Split" IsCheckable="True" Click="Split_Click"/>
                    <MenuItem Header="_HighLight"/>
                    <MenuItem Header="_Show Linenumbers"/>
                </MenuItem>
            </Menu>

            <!--By default pressing tab moves focus to the next control. Setting AcceptsTab to true allows the 
           RichTextBox to accept tab characters. -->
            <RichTextBox Name="mainRTB" AcceptsTab="True" FontFamily="Arial" FontStretch="Normal" VerticalScrollBarVisibility="Auto"></RichTextBox>
        </DockPanel>
    </Grid>
</Window>

【问题讨论】:

    标签: c# wpf dynamic richtextbox


    【解决方案1】:

    从在 WPF 中创建 TabControl 开始, &lt;TabControl Height="500" Width="Auto" FontSize="14" Name="Mytabcontrol"&gt; &lt;/TabControl&gt;

    然后在你的 c# 代码中添加如下内容:

    private void AddTabitem()
    {
        TabItem ti = new TabItem();
        ti.Header = "Tab";
        ti.Content = // Your richtextbox;
        Mytabcontrol.Items.Insert(Mytabcontrol.Items.Count, ti);
        Mytabcontrol.SelectedIndex = Mytabcontrol.Items.Count - 1;
    

    然后是一个 SelectionChanged 事件

        Mytabcontrol.SelectionChanged += new SelectionChangedEventHandler(TabSelectionChanged);
    }
    

    这段代码也可能派上用场:

    void TabSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (Mytabcontrol.SelectedItem != null)
        {
            TabItem ti= Mytabcontrol.SelectedItem as TabItem; // Selected Tab
            if (tabitem.Content != null)
            {
                RichTextBox txt = ti.Content as RichTextBox; // your textbox
            }
        }
    }
    

    【讨论】:

    • @JoJo:这可行,我可以在不同的选项卡中打开文件,但是我无法编辑文件。
    • @user2495173 你在跟我说话吗?你把它贴在我认为错误的答案上;)
    • @JoJo:不,我尝试了你的方法,但大部分都有效,除了文本框没有自动滚动条,我无法编辑文本框中的任何内容。
    • 哎呀 :) 我忘记了自动滚动条。我将编辑那部分。但是你的意思是你不能在文本框中编辑任何东西? @user2495173
    • 我确实得到了滚动条:,我只能读取文件,但是我无法在文本框中编辑任何内容。
    【解决方案2】:

    你需要一个 TabControl

    1) 将 tabControl 添加到您的窗口

    2) 将此代码添加到您的窗口源代码文件中

            //code for adding tabItems to your tabControl            
    
            //when you open a file, string[] richtextBoxLines are the lines
            public TabItem TItem(string HeaderText, string[] richtextBoxLines)
            {
                TabItem t = new TabItem();
                t.Header = HeaderText;
                RichTextBox r = new RichTextBox();
    
                foreach(string s in richtextBoxLines)
                {
                    r.Selection.Text += s;
                }
    
                t.Content = r;
                return t;
            }
            //when you just add a tab
            public TabItem TItem(string HeaderText)
            {
                TabItem t = new TabItem();
                t.Header = HeaderText;
                RichTextBox r = new RichTextBox();
                t.Content = r;
                return t;
            }
    

    现在,您可以像下面的示例一样添加标签

    //read text file text to get an array
    string[] allLines = null; //set to value of textfile lines
    
    //you can add a tab with this text
    myTabControl.Items.Add(TItem("FileName", allLines));
    
    //or you could also add a tab by creating a new text file
    myTabControl.Items.Add(TItem("new Textfile"));
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      相关资源
      最近更新 更多