WPF - 해당되는 글 5건
크리에이티브 커먼즈 라이선스
Creative Commons License
저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comments 3
크리에이티브 커먼즈 라이선스
Creative Commons License

Retrive a XAML text from RichTextBox:

private static string GetRTF(RichTextBox rt)
{
   
TextRange range = new TextRange(rt.Document.ContentStart, rt.Document.ContentEnd);
   
MemoryStream stream = new MemoryStream();
    range
.Save(stream, DataFormats.Xaml);
   
string xamlText = Encoding.UTF8.GetString(stream.ToArray());
   
return xamlText;
}

Render a XAML text into a RichTextBox:

private static FlowDocument SetRTF(string xamlString)
{
   
StringReader stringReader = new StringReader(xamlString);
   
XmlReader xmlReader = XmlReader.Create(stringReader);
   
Section sec = XamlReader.Load(xmlReader) as Section;
   
FlowDocument doc = new FlowDocument();
   
while (sec.Blocks.Count > 0)
        doc
.Blocks.Add(sec.Blocks.FirstBlock);
   
return doc;
}


저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License

Exporting canvas to PNG image

public void ExportToPng(Uri path, Canvas surface)
{
  if (path == null) return;

  // Save current canvas transform
  Transform transform = surface.LayoutTransform;
  // reset current transform (in case it is scaled or rotated)
  surface.LayoutTransform = null;

  // Get the size of canvas
  Size size = new Size(surface.Width, surface.Height);
  // Measure and arrange the surface
  // VERY IMPORTANT
  surface.Measure(size);
  surface.Arrange(new Rect(size));

  // Create a render bitmap and push the surface to it
  RenderTargetBitmap renderBitmap =
    new RenderTargetBitmap(
      (int)size.Width,
      (int)size.Height,
      96d,
      96d,
      PixelFormats.Pbgra32);
  renderBitmap.Render(surface);

  // Create a file stream for saving image
  using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create))
  {
    // Use png encoder for our data
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    // push the rendered bitmap to it
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
    // save the data to the stream
    encoder.Save(outStream);
  }

  // Restore previously saved layout
  surface.LayoutTransform = transform;
}

I’ve again tried to make the code self-explaining. You can try to use different encoders for saving the data so it’s up to you to look through what ones are available. The main trouble many guys come across is blank images as the canvas output or saving canvas programmatically without visualizing it. The key is measuring and arranging the surface before pushing it to render bitmap. As render bitmap does nothing with measuring and arranging elements in this case, this should be regarded mandatory for you. And of course you should remember the zooming/scaling and rotation matrices ;) the layout transformations will also be saved to the image so you should take care of that manually. In my case I cache the LatoutTransform and reset the original value right before measuring canvas.

Paying more attention you can see that bitmap encoder accepts a Visual so canvas is not the only element that can be passed ;) Going down the inheritance tree it is convenient to use the FrameworkElement or pure Visual. FrameworkElement contains Width and Height properties used by canvas.

Default set references provided by WPF application template is quite enough to implement this method. Of course you’ll have to resolve "using" section ;)

Exporting canvas to XPS document

Actually this was the first I’ve started implementing for my application. I like XPS format very much because it is easy to maintain and integrate. Here’s the quick snippet of exporting your canvas to XPS

public void Export(Uri path, Canvas surface)
{
  if (path == null) return;

  // Save current canvas transorm
  Transform transform = surface.LayoutTransform;
  // Temporarily reset the layout transform before saving
  surface.LayoutTransform = null;

  // Get the size of the canvas
  Size size = new Size(surface.Width, surface.Height);
  // Measure and arrange elements
  surface.Measure(size);
  surface.Arrange(new Rect(size));

  // Open new package
  Package package = Package.Open(path.LocalPath, FileMode.Create);
  // Create new xps document based on the package opened
  XpsDocument doc = new XpsDocument(package);
  // Create an instance of XpsDocumentWriter for the document
  XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
  // Write the canvas (as Visual) to the document
  writer.Write(surface);
  // Close document
  doc.Close();
  // Close package
  package.Close();

  // Restore previously saved layout
  surface.LayoutTransform = transform;
}

You will need two additional assemblies to be referenced from the GAC: "ReachFramework.dll" and "System.Printing.dll". Again I’d advice you to backup the original layout transformation regardless it’s state before processing canvas. You should definitely read more details towards System.IO.Packaging and XPS documents. For those who doesn’t know yet the XPS document is presented by zip container for some xml, fonts and binary data like images etc. You can freely rename XPS to ZIP, unpack it and look inside for better understanding when you’ll be looking though MSDN articles towards it.

I was really pleased to find out that 10 or 20 of my duplicated elements having the same image with content template loaded from the separate assembly wasn’t cloned. I had only one image in the XPS for each distinct type of element so the archive size was extremely small for my diagram.

Exporting canvas to the XAML

I’ll give you the most stupid sample that can be found everywhere

public void Export(Uri path, Canvas surface)
    {
      if (path == null) return;
      if (surface == null) return;

      string xaml = XamlWriter.Save(surface);
      File.WriteAllText(path.LocalPath, xaml);
    }

You get the xaml presentation of your canvas that can be later loaded with XamlReader. Be prepared to cuss MS guys a lot because it is rather difficult to adopt any application load anything except simple xamls into your canvas :) The worst thing is that it doesn’t support bindings/multibindings so you’ll have to resolve them somehow on document loading. The same is for events and there’s a list of things not supported that can be easily found at MSDN shipped with Visual Studio. I’ve looked through the Internet to find any good solution but there’s nothing I liked. Guess if it becomes a hot topic (and I’m sure it will become soon) a lot of good overrides will appear. I’m doing my own implementation but it’s in the early stage and cannot be brought to public.


저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License
데이터 바인딩이란 컨트롤과 엘리먼트를 데이터에 연결시키는 기술이다. 이 정의가 약간 모호할 수있는데, 이것은 데이터 바인딩이 굉장히 넓은 범위와 다양한 기술을 포함하기 때문이다. 데이터 바인딩은  CheckBox 컨트롤을 불리언 변수에 연결하는 것처럼 간단할 수 있고 데이터베이스와 데이터 엔트리 패널을 연결하는 것처럼 복잡해 질 수도 있다.
컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 2가지 기능을 제공한다.
가장 간단한 바인딩은 2개의 컨트롤 사이에서 존재하는 것이다. 예를 들어 ScrollBar의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각해보자. 이 경우 Scrollbar의 ValueChanged 이벤트 핸들러를 연결하거나 다음의 스탠드얼론 XAML 파일과 같이 데이터 바인딩을 정의할 수 있다.

<Grid>

        <StackPanel VerticalAlignment="Center">

           <ScrollBar Name="scroll" Orientation="Horizontal"

Margin="24" Maximum="100" LargeChange="10"                                       SmallChange="1"/>

            <Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value}" />

        </StackPanel>

    </Grid>



<Grid>

        <StackPanel VerticalAlignment="Center">

            <ScrollBar Name="scroll" Orientation="Horizontal"

Margin="24" Maximum="100" LargeChange="10"                       SmallChange="1"/>

            <Label HorizontalAlignment="Center">

                <Label.Content>

                    <Binding ElementName="scroll" Path="Value"/>

                </Label.Content>

            </Label>

        </StackPanel>

    </Grid>

 

중괄호 내에 Binding 정의가 있으며, Binding 클래스의 프로퍼티 중 ElementName와 Path가 이 정의에 포함된다. 이 Binding 정의에서 ElementName은 ScrollBar의 Name속성에 부여된 이름인 scroll로 설정되고 Binding의 Path 프로퍼티는 Value로 설정되는데, 이 컨텍스트에서는 ScrollBar의 Value프로퍼티이다. 그 후 Label의 Content 프로퍼티는 ScrollBar의 Value프로퍼티와 바인딩되어 ScrollBar의 조작에 따라 값이 Label에 출력된다.



바인딩은 4가지의 모드를 가지고 있다.
OneWay, TwoWay, OneTime, OneWayTosource로 나열할 수 있다.

기본적인 형태는 아래와 같다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay}" />

 

또한 모드를 TwoWay로 설정할 수도 있다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=TwoWay}" />

이 프로그램에서 TwoWay는 기능상 OneWay와 동일하지만 실제로는 Label의 Content 프로퍼티의 변화도 ScrollBar의 Value프로퍼티에 반영된다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneTime}" />

 OneTime의 경우 타깃이 소스로부터 초기화되지만 소스의 변화가 계속적으로 반영되지 않고 초기에 한번만 반영된다. 이 프로그래에서는 ScrollBar의 초기 Value가 0이기 때문에 Label이 0을 표시하며, 표시된 값은 ScrollBar의 변화에 더 이상 반응하지 않는다.

 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWayToSource}" />

 이것은 일반적으로 생각하는 소스와 타깃의 의미에 반대되게 타깃이 소스를 갱신하는 형태이다. 마치 과녁이 거꾸로 화살 쪽으로 날아와 과녁의 중심을 스스로 찌르는 듯한 형태라고 볼 수 있다. 따라서 타깃(Label)은 소스(ScrollBar)를 갱신해야 한다.

DataContext 프로퍼티가 상당히 유용할 때가 있는데, DataContext가 엘리먼트 트리를 통해 상속되기 때문에 하나의 엘리먼트에 DataContext를 사용해 바인딩을 설정하면 aems 자식 엘리먼트에도 동일하게 적용된다.

<Grid>

        <StackPanel VerticalAlignment="Center" DataContext="{Binding ElementName=scroll}">

            <ScrollBar Name="scroll" Orientation="Horizontal" Margin="24" Maximum="100" LargeChange="10"  SmallChange="1"/>

            <Label HorizontalAlignment="Center" Content="{Binding Path=Value, Mode=OneWay}" />

            <Button HorizontalAlignment="Center" Margin="24" FontSize="{Binding Path=Value, Mode=OneWay}">Bound Button</Button>

        </StackPanel>

    </Grid>

DataContext StackPanel엘리먼트에서 한 번 설정되었고 Label Button ScrollBar와 바운딩됐다. Label에 바운딩된 프로퍼티는 Context이지만 Button에 바운딩된 프로퍼티는 FontSize이기 때문에 ScrollBar의 막대를 움직이면 Button 내부의 텍스트가 점점 커지고 이에 따라 Button 자체도 커지게 된다.







저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License
데이터 바인딩이란 컨트롤과 엘리먼트를 데이터에 연결시키는 기술이다. 이 정의가 약간 모호할 수있는데, 이것은 데이터 바인딩이 굉장히 넓은 범위와 다양한 기술을 포함하기 때문이다. 데이터 바인딩은  CheckBox 컨트롤을 불리언 변수에 연결하는 것처럼 간단할 수 있고 데이터베이스와 데이터 엔트리 패널을 연결하는 것처럼 복잡해 질 수도 있다.
컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 2가지 기능을 제공한다.
가장 간단한 바인딩은 2개의 컨트롤 사이에서 존재하는 것이다. 예를 들어 ScrollBar의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각해보자. 이 경우 Scrollbar의 ValueChanged 이벤트 핸들러를 연결하거나 다음의 스탠드얼론 XAML 파일과 같이 데이터 바인딩을 정의할 수 있다.

<Grid>

        <StackPanel VerticalAlignment="Center">

           <ScrollBar Name="scroll" Orientation="Horizontal"

Margin="24" Maximum="100" LargeChange="10"                                       SmallChange="1"/>

            <Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value}" />

        </StackPanel>

    </Grid>



<Grid>

        <StackPanel VerticalAlignment="Center">

            <ScrollBar Name="scroll" Orientation="Horizontal"

Margin="24" Maximum="100" LargeChange="10"                       SmallChange="1"/>

            <Label HorizontalAlignment="Center">

                <Label.Content>

                    <Binding ElementName="scroll" Path="Value"/>

                </Label.Content>

            </Label>

        </StackPanel>

    </Grid>

 

중괄호 내에 Binding 정의가 있으며, Binding 클래스의 프로퍼티 중 ElementName와 Path가 이 정의에 포함된다. 이 Binding 정의에서 ElementName은 ScrollBar의 Name속성에 부여된 이름인 scroll로 설정되고 Binding의 Path 프로퍼티는 Value로 설정되는데, 이 컨텍스트에서는 ScrollBar의 Value프로퍼티이다. 그 후 Label의 Content 프로퍼티는 ScrollBar의 Value프로퍼티와 바인딩되어 ScrollBar의 조작에 따라 값이 Label에 출력된다.



바인딩은 4가지의 모드를 가지고 있다.
OneWay, TwoWay, OneTime, OneWayTosource로 나열할 수 있다.

기본적인 형태는 아래와 같다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay}" />

 

또한 모드를 TwoWay로 설정할 수도 있다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=TwoWay}" />

이 프로그램에서 TwoWay는 기능상 OneWay와 동일하지만 실제로는 Label의 Content 프로퍼티의 변화도 ScrollBar의 Value프로퍼티에 반영된다. 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneTime}" />

 OneTime의 경우 타깃이 소스로부터 초기화되지만 소스의 변화가 계속적으로 반영되지 않고 초기에 한번만 반영된다. 이 프로그래에서는 ScrollBar의 초기 Value가 0이기 때문에 Label이 0을 표시하며, 표시된 값은 ScrollBar의 변화에 더 이상 반응하지 않는다.

 

<Label HorizontalAlignment="Center"

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWayToSource}" />

 이것은 일반적으로 생각하는 소스와 타깃의 의미에 반대되게 타깃이 소스를 갱신하는 형태이다. 마치 과녁이 거꾸로 화살 쪽으로 날아와 과녁의 중심을 스스로 찌르는 듯한 형태라고 볼 수 있다. 따라서 타깃(Label)은 소스(ScrollBar)를 갱신해야 한다.

DataContext 프로퍼티가 상당히 유용할 때가 있는데, DataContext가 엘리먼트 트리를 통해 상속되기 때문에 하나의 엘리먼트에 DataContext를 사용해 바인딩을 설정하면 aems 자식 엘리먼트에도 동일하게 적용된다.

<Grid>

        <StackPanel VerticalAlignment="Center" DataContext="{Binding ElementName=scroll}">

            <ScrollBar Name="scroll" Orientation="Horizontal" Margin="24" Maximum="100" LargeChange="10"  SmallChange="1"/>

            <Label HorizontalAlignment="Center" Content="{Binding Path=Value, Mode=OneWay}" />

            <Button HorizontalAlignment="Center" Margin="24" FontSize="{Binding Path=Value, Mode=OneWay}">Bound Button</Button>

        </StackPanel>

    </Grid>

DataContext StackPanel엘리먼트에서 한 번 설정되었고 Label Button ScrollBar와 바운딩됐다. Label에 바운딩된 프로퍼티는 Context이지만 Button에 바운딩된 프로퍼티는 FontSize이기 때문에 ScrollBar의 막대를 움직이면 Button 내부의 텍스트가 점점 커지고 이에 따라 Button 자체도 커지게 된다.







저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License


Windows Presentation Foundation 설명

기본적으로 기술은 주로 전문가들이 중요하게 생각하는 부분으로 대부분의 소프트웨어 전문가들은 응용 프로그램과 사용자 간의 상호 작용 방식보다는 응용 프로그램의 작동 방식에 훨씬 더 많은 관심을 가집니다. 그러나 응용 프로그램을 구입하는 실제 사용자에게는 사용자 인터페이스가 매우 중요합니다. 응용 프로그램의 인터페이스는 해당 소프트웨어에 대한 전체적인 사용자 환경에서 중요한 부분을 차지하며, 사용자에게 이러한 환경은 응용 프로그램 '그 자체'를 의미합니다. 더 나은 인터페이스를 통해 향상된 사용자 환경을 제공하면 생산성을 높이고 우수 고객을 더 많이 확보할 수 있으며 웹 사이트에서의 매출을 늘리는 등 다양한 효과를 얻을 수 있습니다.

이전에는 문자 기반 인터페이스만으로 충분했지만 오늘날의 사용자들은 그래픽 인터페이스에 익숙해졌으며 사용자 인터페이스에 대한 요구 사항은 계속해서 증가하고 있습니다. 그래픽과 미디어가 더욱 광범위하게 사용되고 있으며 웹의 발전은 소프트웨어와의 편리한 상호 작용을 기대하는 사용자 계층을 형성하게 되었습니다. 사용자들이 응용 프로그램을 사용하는 시간이 늘어날수록 해당 응용 프로그램의 인터페이스는 더욱 중요해집니다. 이렇듯 점점 높아지는 인터페이스 요구 사항에 부응하기 위해서는 사용자 인터페이스를 만드는 기술도 함께 발전해야 합니다.

WPF(Windows Presentation Foundation)의 목표는 Windows에 바로 이러한 고급 기능을 제공하는 것입니다.  WPF를 사용하면 문서, 미디어, 2차원 및 3차원 그래픽, 애니메이션, 웹 특성 등을 포함하는 인터페이스를 만들 수 있습니다.

그림 1. WPF 인터페이스에서는 이미지, 텍스트, 2D 그래픽, 3D 그래픽 등을 결합할 수 있습니다.

이 화면에서는 텍스트와 이미지를 비롯하여 2차원 그래픽 및 3차원 그래픽을 함께 볼 수 있습니다. 이 모든 인터페이스는 개발자가 GDI+ 또는 Direct3D와 같은 특수 그래픽 기술을 사용하는 코드를 작성할 필요 없이 WPF를 사용하여 생성되었습니다. WPF를 사용하면 다음 그림에서 볼 수 있는 초음파 진단 결과처럼 비디오를 표시하고 메모를 입력하는 기능을 구현할 수도 있습니다.

그림 2. WPF 인터페이스에는 비디오뿐만 아니라 사용자가 입력할 수 있는 텍스트 메모를 모두 포함할 수 있습니다.

WPF를 사용하면 읽기 편리한 방식으로 문서를 표시할 수 있습니다. 예를 들어 병원 응용 프로그램의 경우 의사가 환자의 처방전에 대한 기록을 조회하거나 관련 항목에 대한 최근의 의학 연구 자료에 액세스할 수 있습니다. 아래의 화면에서 볼 수 있는 것처럼 의사는 메모를 추가할 수 있습니다.

그림 3. WPF 인터페이스에서는 메모를 포함하여 여러 개의 열이 있는 문서를 표시할 수 있습니다.

이 화면에서 문서는 가독성이 뛰어난 열 형식으로 표시되고 사용자는 스크롤 방식이 아니라 문서를 한 페이지씩 이동할 수 있습니다. 화면을 보기 쉽게 표시하는 것도 WPF의 중요한 목표 중 하나입니다. 그러나 화면에 표시되는 문서보다 고정된 형식의 문서를 사용하는 것이 적절한 경우도 있습니다. 고정된 형식의 문서는 화면에서 볼 때나 인쇄했을 때 모양이 동일하기 때문에 항상 일관된 모양을 제공합니다. 이러한 형식의 문서를 정의하기 위해 Microsoft는 XPS(XML Paper Specification)를 만들었습니다. WPF는 개발자가 XPS 문서를 만들고 작업하는 데 사용할 수 있는 API(응용 프로그래밍 인터페이스) 그룹도 제공합니다.

그러나 최신 사용자 인터페이스를 만드는 것은 독립적인 여러 기술을 단순히 통합하는 것이 아니라 최신 그래픽 카드의 장점을 활용할 수 있다는 의미를 가지고 있습니다. 즉, WPF는 시스템의 GPU(Graphics Processing Unit)에 가능한 한 많은 작업 로드를 분산시킴으로써 GPU를 최대한 활용합니다. 또한 최신 인터페이스는 비트맵 그래픽의 한계에 제약을 받지 않아야 하므로 WPF는 화면의 크기와 해상도에 맞게 이미지 크기가 자동으로 조정되도록 벡터 그래픽 기술을 사용합니다. 따라서 개발자는 작은 모니터와 대형 TV 화면에 표시할 그래픽을 개별적으로 만들지 않고 WPF를 통해 이러한 크기 조정 작업을 자동으로 처리할 수 있습니다.

WPF는 사용자 인터페이스를 만드는 데 필요한 모든 기술을 하나의 기반에 집약함으로써 이러한 인터페이스를 만드는 개발자의 업무 부담을 크게 낮추어 줍니다. WPF를 사용하는 경우 개발자는 하나의 작업 환경만 파악하면 되기 때문에 응용 프로그램 개발 및 유지 관리에 소요되는 비용이 훨씬 저렴합니다. 또한 WPF를 사용하면 그래픽, 비디오 등의 다양한 요소가 포함된 인터페이스를 간단하게 구현할 수 있으므로 사용자가 Windows 응용 프로그램과 상호 작용하는 방식을 개선하고 업무 효율성을 높일 수 있습니다.


개발자와 디자이너가 공동으로 작업할 수 있는 환경

개발자와 디자이너는 업무 진행 방식이 서로 다르기 때문에 두 분야의 전문가가 공동으로 작업하는 데는 여러 가지 문제가 있습니다. 일반적으로 디자이너는 그래픽 도구를 사용하여 응용 프로그램에 표시할 화면 레이아웃의 정적 이미지를 만듭니다. 그런 다음 이러한 이미지를 개발자에게 전달하고, 개발자는 해당 이미지를 구현하는 코드를 작성합니다. 그러나 디자이너는 만들기 쉽더라도 개발자는 구현하기 어렵거나 전혀 구현할 수 없는 이미지도 있습니다. 예를 들어 개발자는 기술적인 한계, 촉박한 일정, 기술 부족, 사소한 오해 또는 단순한 의견 차이로 인해 디자이너의 의도를 완벽하게 구현하지 못할 수 있습니다. 따라서 최상의 인터페이스를 만들기 위해서는 독립적인 두 분야의 전문가가 인터페이스의 품질을 떨어뜨리지 않으면서 공동으로 작업할 수 있는 환경이 필요합니다.

WPF는 이러한 공동 작업이 가능하도록 XAML(eXtensible Application Markup Language)을 사용합니다. XAML은 사용자 인터페이스의 모양을 정확하게 정의하기 위해 ButtonTextBoxLabel 등 여러 XML 요소의 집합을 정의합니다. 일반적으로 XAML 요소는 다양한 옵션을 설정할 수 있도록 특성도 포함합니다. 

XAML로 표현할 수 있는 모든 것을 코드를 사용하여 동일하게 작성할 수 있다면 XAML을 사용할 필요가 없다고 생각할 수도 있습니다. 그러나 XML 기반의 설명을 생성하고 사용하는 작성 도구를 사용하면 코드를 사용하여 동일한 작업을 할 때보다 훨씬 쉽게 작업할 수 있습니다. XAML은 사용이 편리한 도구 방식으로 사용자 인터페이스를 설명하기 때문에 개발자와 디자이너가 더 효율적으로 함께 작업할 수 있습니다. 





저작자 표시
신고
Trackback 0 | Comment 0

강군v's Blog is powered by Daum & tistory

 

티스토리 툴바