요즘 들어 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); //photo를 ArrayList에 담습니다. } |
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; } |
위 메서드에 대한 설명입니다 .MSDN에서 출처했습니다ㅋㅋ;
'programming > WPF' 카테고리의 다른 글
[WPF] Image URL 주소를 받아서 Bitmap이미지로 변환시켜주는 함수 (0) | 2010.07.28 |
---|---|
[RichTextBox] Text 얻어오기 함수 (0) | 2010.07.08 |