Отображать текстовые данные из базы данных в WPF RichTextBox - PullRequest
1 голос
/ 07 апреля 2020

У меня есть следующий пользовательский элемент управления xaml, содержащий несколько элементов управления RichTextBox:

<UserControl x:Class="Organizer.UserControls.RowViewUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Organizer.UserControls"
             xmlns:viewmodels="clr-namespace:Organizer.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
             x:Name="ucRow">

    <DockPanel Margin="2 2 2 2" Grid.Row="2" Grid.Column="1">

        <RichTextBox x:Name="RTBMinus5" Margin="1 0 0 3" DockPanel.Dock="Top" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBMinus4" Margin="1 0 0 3" DockPanel.Dock="Top" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBMinus3" Margin="1 0 0 3" DockPanel.Dock="Top" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBMinus2" Margin="1 0 0 3" DockPanel.Dock="Top" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBMinus1" Margin="1 0 0 3" DockPanel.Dock="Top" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>

        <RichTextBox x:Name="RTBPlus5" Margin="1 0 0 3" DockPanel.Dock="Bottom" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBPlus4" Margin="1 0 0 3" DockPanel.Dock="Bottom" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBPlus3" Margin="1 0 0 3" DockPanel.Dock="Bottom" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBPlus2" Margin="1 0 0 3" DockPanel.Dock="Bottom" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>
        <RichTextBox x:Name="RTBPlus1" Margin="1 0 0 3" DockPanel.Dock="Bottom" Height="{Binding RowHeightSliderValue}" BorderBrush="Gray" Background="Black" Foreground="Gray" FontSize="14"/>

        <RichTextBox Name="RTBSelected" Margin="1 0 0 3" BorderBrush="Purple" Background="Black" Foreground="White" FontSize="18" />

    </DockPanel>
</UserControl>

... и следующий код, где я определяю метод ShowTextInRow (string texttring), который можно вызывать откуда-то еще в программе, чтобы взять текстовую строку и отобразить ее в RichTextBox с именем "RTBSelected":

using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace Organizer.UserControls
{
    public partial class RowViewUserControl : UserControl
    {
        public RowViewUserControl()
        {
            InitializeComponent();
        }

        public static void ShowTextInRow(string textstring)
        {
            // Source: https://stackoverflow.com/questions/15983278/storing-data-of-rich-text-box-to-database-with-formatting
            byte[] byteArray = Encoding.ASCII.GetBytes(textstring);
            using (MemoryStream ms = new MemoryStream(byteArray))
            {
                TextRange tr = new TextRange(RTBSelected.Document.ContentStart, RTBSelected.Document.ContentEnd);
                tr.Load(ms, DataFormats.Rtf);
            }
        }
    }
}

Я застрял со следующей проблемой: если я объявляю метод "ShowTextInRow ()" как stati c тогда codebehind не распознает ссылку на RichTextBox по имени «RTBSelected». С другой стороны, если я удаляю объявление 'stati c' из метода "ShowTexdInRow ()", codebehind, кажется, распознает RichTextBox по его имени "RTBSelected", но я больше не могу вызывать этот метод из других мест в моем Программа.

Извините, если я что-то упустил очень основы c - я новичок в C # / WPF. Заранее спасибо за поддержку.

1 Ответ

0 голосов
/ 07 апреля 2020

Поскольку эта операция является частью UserControl, вы не захотите называть ее stati c. Называя его stati c, вы получите другие ошибки, которые вы попытаетесь загрузить в RichTextBox, который не существует. UserControl необходимо инициализировать, прежде чем что-либо делать с ним.

Удалите декларацию stati c и вызовите ее из других областей вашей программы, сначала инициализировав UserControl.

Stati c объявление удалено:

public void ShowTextInRow(string textstring)
{
      // Source: https://stackoverflow.com/questions/15983278/storing-data-of-rich-text-box-to-database-with-formatting
      byte[] byteArray = Encoding.ASCII.GetBytes(textstring);
      using (MemoryStream ms = new MemoryStream(byteArray))
      {
           TextRange tr = new TextRange(RTBSelected.Document.ContentStart, RTBSelected.Document.ContentEnd);
           tr.Load(ms, DataFormats.Rtf);
      }
}

Вызов из других областей в пространстве имен:

RowViewUserControl rvuc = new RowViewUserControl();
rvuc.ShowTextInRow("Hello World");
...