본문 바로가기

programming/WPF

(WPF) RichTextBox - 이미지, 텍스트를 XML로 저장하기


요즘 들어 XML로 장난을 많이 치는군요 -0-;;; 암튼 본론으로 넘어갑니다
 일단 저질스러운 UI ㅋㅋ  XML 저장버튼과 이미지삽입 버튼을 ToolBar위에 올려놓고 밑에 RichTextBox 컨트롤을 놓겠습니다. (그냥 TextBox가 아닌점 주의ㅋ!!)

 시나리오는 이번에도 간단합니다. RichTextBox에 이미지를 여러 개를 삽입하고, 글 또한 입력 후 XML 파일로 저장하는 시나리오 입니다.

전역으로 선언하였습니다

 byte[] photo = null;              //Image 저장 변수

ArrayList bnt = new ArrayList();  //photo 담는ArrayList



 이미지를 byte로 바꾸주는 함수입니다.

public static byte[] GetPhoto(string filepath)   //이미지 저장 함수.

{

      FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read);

      BinaryReader reader = new BinaryReader(stream);

      byte[] photo = reader.ReadBytes((int)stream.Length);

      reader.Close();

      stream.Close();

      return photo;

}


그리고 이미지삽입 버튼에 대한 소스입니다.
간단하게 이미지를 삽입시켜주고, GetPhoto함수를 사용하여 Byte배열(photo)로 바꾼후, ArrayList에 넣어줍니다.

private void button2_Click(object sender, RoutedEventArgs e)   //이미지 삽입

{

     string imgpath; // 경로저장변수

 

     OpenFileDialog dlg = new OpenFileDialog();

     dlg.DefaultExt = ".jpg";  //기본 확장자

     dlg.Filter = "Image Files(.jpg)|*.jpg"; // 확장 파일 필터

     dlg.ShowDialog();

 

     imgpath = dlg.FileName;

 

     if (string.IsNullOrEmpty(imgpath)) return;

 

     Uri uri = new Uri(imgpath);

     BitmapImage bmp = new BitmapImage();

     bmp.BeginInit();

     bmp.UriSource = uri;

     bmp.EndInit();    //BitmapImage ImageSource 생성하기

 

     TextPointer tp;

     Image image = new Image();

     image.Source = bmp;

     image.Stretch = Stretch.UniformToFill;

 

     richTextBox1.BeginChange();  //TextChange 이벤트 조정

    

     tp = richTextBox1.CaretPosition.GetPositionAtOffset(0,                            LogicalDirection.Forward);

     InlineUIContainer inlineUIContainer = new InlineUIContainer(image, tp);

 

     richTextBox1.CaretPosition = inlineUIContainer.ElementEnd;

     richTextBox1.EndChange();

     richTextBox1.Focus();  //포커스가 RichTextBox로 돌아가도록 조정

 

     photo = GetPhoto(imgpath);   // photo에 담아두기

     bnt.Add(photo); //photoArrayList에 담습니다.

}



 XML로 저장하는 버튼에 대한 소스입니다. DataSet을 이용하여 XMl로 저장하겠습니다.

private void button1_Click(object sender, RoutedEventArgs e)   //XML 저장

{

      DataSet ds = new DataSet();

      DataTable dt = new DataTable("myTable");

 

      //RichTextBox에 있는 텍스트를 담아주는 Column입니다.

      DataColumn dc = new DataColumn("Content", typeof(string));

      dt.Columns.Add(dc);

 

      int imageCnt = bnt.Count;

      //Image를 삽입할 때 마다 Column을 생성시켜주는 반복문입니다.

      for (int i = 0; i < imageCnt; i++)

      {

          dc = new DataColumn("image" + i.ToString(), typeof(byte[]));

          dt.Columns.Add(dc);

      }

      ds.Tables.Add(dt);

 

      DataRow dr = dt.NewRow();

      //텍스를 Row에 담아줍니다 String 어쩌고 함수는 이따 설명~

      dr["Content"] = StringFromRichTextBox(richTextBox1);

      //Image 또한 반복문을 돌려서 Row에 담아주겠습니다.

      for (int i = 0; i < imageCnt; i++)

      {

          dr[i + 1] = bnt[i];

      }

      ds.Tables["myTable"].Rows.Add(dr);

 

      SaveFileDialog save = new SaveFileDialog();

      save.Filter = "xml file (*.*)|*.*"; //파일 필터링

 

      if (save.ShowDialog() == true)

      {

          if (File.Exists(save.FileName))

          {

              ds.WriteXml(save.FileName); //XML로 저장!!!

      }

   }

}



 String어쩌고 함수입니다.

string StringFromRichTextBox(RichTextBox rtb)

{

    TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

return textRange.Text;

}

 이 메서드는 ContentStartContentEnd로 추출할 콘텐츠의 범위를 지정하여 RichTextBox의 콘텐츠에서 새 TextRange를 만듭니다.ContentStartContentEnd 속성은 각각 TextPointer를 반환하며 RichTextBox의 콘텐츠를 나타내는 기본 FlowDocument에서 액세스할 수 있습니다.TextRangeTextRange의 일반 텍스트 부분을 문자열로 반환하는 Text 속성을 제공합니다.

  위 메서드에 대한 설명입니다 .MSDN에서 출처했습니다ㅋㅋ;