먼저 나의 스펙을 말하자면, 대학 시절 성적은 나쁘지 않았고 수상 경력과 논문도 있었지만, 특별히 내세울 만한 건 없었다.

  1. 토익은 발바닥 수준.
  2. 정보처리기사도 못 땄다.

이런 상태에서 멀티캠퍼스에서 Java 백엔드 교육을 들었다(온라인).

하지만 솔직히, 멍 때리고 놓치면 하루 종일 헤매는 정도였고, 나에게 큰 도움이 되지 않았다.

6개월의 교육이 끝났지만, 결국 CURD 정도만 할 줄 아는 백엔드 개발자로 느껴졌다. 그 이상은 없었다.

 

 

 

교육이 끝난 후,

자소서를 쓰다가 답이 없길래 대충 30군데 정도 이력서를 넣었다.

기대도 안 했는데, 4군데에서 연락이 왔다. 처음에는 Java 관련 회사에만 지원하다가,

찾아보니 C#, WPF라는 분야도 있다는 걸 알게 되었다.

 

악명 높은 제조업 분야였다. 인터넷에서 "제조업 가면 안 된다", "공장에서 산다"는 말들이 많았다. 그래도 면접을 보러 갔다.

면접에서는 지식 위주로 질문을 받았고, 결국 합격했다.

(c#,wpf 2곳을 봤는데 남은 한곳은 술이 필수이며, 공장에서 살아야한다! 라고 했....음;; 요즘 시대에?)

 

 

현재 상황을 정리하자면:

C#은 백엔드, WPF는 프론트엔드였다!

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그냥 웹과 비슷하게 윈도우 프로그램을 만든다고 생각하면 된다. 웹을 해봤다면 쉬울 수도 있다(내 경험상 그렇다).

 

기계 자동화 기술과 PLC(Programmable Logic Controller) 관련 지식이 필요하긴 하지만,

나는 그쪽을 직접 다루지 않는다.

 

회사에서 이미 만들어둔 코드를 복사해 약간 수정하는 수준이다.

코드를 복사하면서 이해하고, 약간의 변형을 주는 정도다.

 

아직 공장 현장에 직접 간 적은 없고,

상사분들도 많아야 일주일에 1~2번 가는 정도다.

주로 프로젝트 마무리나 설치할 때 현장에 가는 것 같다.

(그렇다고 공장에 길어야 4시간 정도고 하루종일 있지 않다)

주로 회사에서 코딩한다. 

 

아직 현장 경험은 없지만, 지금까지는 회사 생활에 만족하고 있다.

칼퇴! 칼퇴! 땡하면 집가!!!!

회식도 나의 환영회 말고는 없었다! 


 

역시 인터넷 세상을 믿을게 못되는 것 같다. 

직접 해보지 않으면 모르는 것들이 너무나 많다. 

다른점도 너무나 많고, 

비행기는 매번 탈때마다 느낌이 다르고, 해외에서 악명 높은 비행기 '라이언에어'도 타봤지만 

나는 세상에서 가장 침대같은 느낌의 착륙느낌이었다. (처음 느껴보는! )

셀프체크인할때도 직원분이 코리아 좋다면서 웃으면서 말걸어주기도 하였다!

 

 

이렇게 매 시기마다 후기는 달라진다. 

세상에 얼마나 많은 중소기업이 있는데!

 

 

 

'중소벤처기업부' 사이트를 보면 다음과 같이 말한다. 

 

 

2023년 기준, 한국에는 약 700만 개의 중소기업이 있습니다.
중소기업은 전체 기업 수의 99% 이상을 차지하며, 전체 고용의 약 **80%**를 담당하고 있습니다.

https://www.mss.go.kr/site/eng/02/20202000000002019110610.jsp

 

Ministry of SMEs and Startups

SMEs play an important role in Korean Economy. According to business statistics, SMEs take up ninety-nine percent of number of enterprises, eighty-three percent of total employment, thirty-four percent of export.

www.mss.go.kr

 

 

고작 인터넷의 안좋은 글만 보고, 대기업을 못가는 사람들이 중소기업을 쳐다도 안보고

집에서만 있는 행위는 멈추기 바란다. 

 

공부도 하기 싫은 데 취직 공부한다는 다짐만하고 아무것도 안할 바에는 좋은 중소기업가서 편하게 일하고 1년에 3천만원이라는 돈을 버는게 나에게는 최선이라는 것이다. 

 

 

XML이란?

XML(Extensible Markup Language)는 데이터 저장 및 전송을 위한 마크업 언어입니다.

XML은 주로 데이터 구조를 정의하고 정보를 계층적으로 표현하는 데 사용됩니다.

 

 

XML의 기본 구조

XML 문서는 다음과 같은 기본 구성 요소로 이루어져 있습니다:

  1. 선언:
    • XML 문서의 시작 부분에 XML 선언이 포함됩니다. 예: <?xml version="1.0" encoding="UTF-8"?>
  2. 루트 요소:
    • XML 문서는 단 하나의 루트 요소(root element)를 가져야 합니다. 모든 다른 요소는 이 루트 요소의 하위 요소가 됩니다.
  3. 요소(Elements):
    • 요소는 XML 문서의 기본 단위로, 시작 태그와 종료 태그로 구성됩니다. 예: <element>Content</element>
  4. 속성(Attributes):
    • 요소는 추가 정보를 제공하는 속성을 가질 수 있습니다. 속성은 시작 태그 내에 정의됩니다. 예: <element id="1">Content</element>
  5. 텍스트 콘텐츠:
    • 요소는 데이터를 담고 있는 텍스트 콘텐츠를 포함할 수 있습니다. 요소는 텍스트, 다른 요소, 또는 두 가지를 모두 포함할 수 있습니다.

 

[예시코드]

<?xml version="1.0" encoding="UTF-8"?>
<Library>
    <Book id="1">
        <Title>Effective C#</Title>
        <Author>Bill Wagner</Author>
        <Year>2019</Year>
    </Book>
    <Book id="2">
        <Title>Learning XML</Title>
        <Author>Erik T. Ray</Author>
        <Year>2003</Year>
    </Book>
</Library>

 

  • 루트 요소: <Library>
  • 하위 요소: <Book>, <Title>, <Author>, <Year>
  • 속성: <Book id="1">에서 id 속성

 

 

XML의 장점

  1. 가독성: XML은 텍스트 기반으로, 사람이 읽고 이해하기 쉽습니다.
  2. 확장성: 새로운 데이터 구조를 쉽게 추가할 수 있습니다.
  3. 표준화: 다양한 플랫폼과 언어에서 지원됩니다.

 

 


 

 

 

 

 

이 함수는 화면의 버튼을 클릭하면 작동하는 함수이다. 

코드에 주석으로 아주 자세히 작성해였다. 

 private void btn_Add_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
 {
     try
     { 
		// 파일 열기 대화상자를 생성
         OpenFileDialog dlg = new OpenFileDialog();

		// 사용자가 파일을 선택했는지 확인
         if(dlg.ShowDialog() == DialogResult.OK)
         {
         	 // XML 문서를 로드하기 위한 XmlDocument 객체 생성
             XmlDocument doc = new XmlDocument();
             // 사용자가 선택한 XML 파일을 로드
             doc.Load(dlg.FileName);

             // XML 내의 모든 Message 노드를 가져오기
             // XPath 쿼리를 사용하여 A아래의 B노드들을 선택
             XmlNodeList messageNodes = doc.SelectNodes("/A/B");

             foreach (XmlNode messageNode in messageNodes)
             {
                 // <B> 노드의 id 속성 값
                 string messageId = messageNode.Attributes["id"].Value;

                 // <B> 하위의 <one>, <two>, <three> 값 추출
                 string ONE = messageNode.SelectSingleNode("one")?.InnerText.Trim();
                 string TWO = messageNode.SelectSingleNode("two")?.InnerText.Trim();
                 string THREE = messageNode.SelectSingleNode("three")?.InnerText.Trim();                         
				 
                 // 데이터베이스에 메시지를 저장하는 메서드 호출
                 this.{db 불러오는 형식}.(messageId, ONE, TWO, THREE);
             }
         }
     }
     catch(Exception ex)
     { 
     }
 }

 

 

 

 

별도로 체크해야할 것

 

 

1. .XML의 구조


<?xml version="1.0"?>
  <!-- ================================================================ -->
  <!--                             정보                       -->
  <!--                             정보~               -->
  <!-- ================================================================ -->
<A> 
  <B id="WHAT">
    <one> information </one >
    <two> information </two >
    <three> information  </three >
  </B>

  <B id="how">   
    <one> information </one >
    <two> information </two >
    <three> information </three >
  </B>
</A>

 

 

2. db 연결 부분 

{} 안의 내용을 각자 개별적으로 알아서 수정해야한다. 

(물론 {}도 나중에 삭제해야함!)

 

 

 

 

 

 

[ 문제 ]

DevExpress WPF Charts에서 

일, 주 일때는 그래프가 잘 보이는데, 

달(month)일때는 실같이 얇~게 보여서 엥엥엥 하루종일 찾아봤는데 결국 못찾음......

그 후 시간이 흘러 ......

 

 

 

 

이것도 안됨..

                //for (int i = 0; i < 4; i++)
                //{
                //    var series = new BarStackedSeries2D();
                //    series.BarWidth = 1;  
                //    this.cht_Main.Series.Add(series);
                //}

 

 

chat gpt는 다음과 같이 알려줌.. (이건 걍 안됨)

axisy.wholerange.setminmaxvalues(0, 30);

 

 

 

 

 

[해결방법]

아래와 같이 하면 된다.!

https://docs.devexpress.com/WPF/115179/controls-and-libraries/charts-suite/chart-control/axes/axis-scale-types

   this.cht_Main.AxisX.DateTimeScaleOptions = new ManualDateTimeScaleOptions()
   {
       MeasureUnit =DevExpress.Xpf.Charts.DateTimeMeasureUnit.Month
   };

 

 

 

 

 

1. .xaml에 ComboBox를 추가한다. 

<ComboBox x:Name="cbb_{변수명}" SelectedValuePath="Key" DisplayMemberPath="Value" />

SelectedValuePath는 선택되는 항목을 아래(2)에서 보이듯이 

dicTemp의 Key값을 보일 것인지, Value값을 보일 것인지 정한다. 

보통 저렇게 지정하는 것 같다.

 

만약 여기서 지정하기 싫다면 

.cs 파일 내에서 이렇게 지정해 줄수도 있다. 

 

   this.cbb_{변수명}.SelectedValuePath = "Key";
   this.cbb_{변수명}.DisplayMemberPath = "Value";

 

 

 

2-0. chat gpt에 물어보니 

   public class 함수명   
      {
          public string Key { get; set; }
          public clsEnum.{Values} Value { get; set; }
          public 함수명(clsEnum.{Values} Key, string value)   생성자
          {
	       Key = key;	
              Value = value;
              
          }
          public override string ToString()
          {
              return Value;   ComboBox에 표시할 텍스트
          }
      }

이런식으로 사용하라는데;;

그냥  Dictionary<string, string> dicTemp = new Dictionary<string, string>(); 이거쓰면 한 줄에 가능. 

 

 

 

 

2. .cs에

Startprocess()부분에 

Dictionary<string, string> dicTemp = new Dictionary<string, string>();

this.cbb_{comboBox명}.SelectionChanged -= Cbb_{comboBox명}_SelectionChanged;
dicTemp.Clear();
dicTemp.Add( .Tostring(), "전체");
dicTemp.Add( .Tostring(), "전체");
dicTemp.Add( .Tostring(), "전체");
this.cbb_{comboBox명}.ItemsSource = new BindingSource(dicTemp, null);
this.cbb_{comboBox명}.SelectedIndex = 0;
this.cbb_{comboBox명}.SelectionChanged += Cbb_{comboBox명}_SelectionChanged;

 

dicTemp에 값들을 넣어준다. 

bindingSource를 해야 값이 들어간다. 

 

 Dictionary<string, string> dicTemp = new Dictionary<string, string>(); 은 

 Dictionary<int, string> dicTemp = new Dictionary<int, string>(); 

이렇게 구성할 수 도 있고, 저장한 데이터 타입에 따라 변경하면 된다. 

 

[ dicTemp의 것을 활용하는 방법 ]

this.{comboBox명}.SelectedItem == null  //dic로 담긴게 있는지
this.{comboBox명}.SelectedValue.Tostring()
(int)this.{comboBox명}.SelectedValue  //dic의 value값(앞인지, 뒤인지 잘모르겠음 아직도)

 

 

 

 


 

 

+ ComboBox의 - PopUp class의 Placement 

Popup이 화면에 표시될 위치를 결정하는 데 사용된다. 

 

  • Absolute: 기준 요소와 무관하게 화면의 절대 좌표를 기준으로 위치를 지정합니다.
  • Relative: 기준 요소의 좌측 상단 모서리를 기준으로 상대적인 위치를 지정합니다.
  • Bottom: 기준 요소의 아래쪽에 Popup을 표시합니다.
  • Center: 기준 요소의 중심에 Popup을 표시합니다.
  • Right: 기준 요소의 오른쪽에 Popup을 표시합니다.
  • AbsolutePoint: 기준 요소와 무관하게 화면의 절대 좌표를 기준으로 위치를 지정합니다. HorizontalOffset와 VerticalOffset 속성을 사용하여 조정할 수 있습니다.
  • RelativePoint: 기준 요소의 좌측 상단 모서리를 기준으로 상대적인 위치를 지정합니다. HorizontalOffset와 VerticalOffset 속성을 사용하여 조정할 수 있습니다.
  • Mouse: 마우스 커서 위치를 기준으로 Popup을 표시합니다. (ComboBox 중 클릭한 위치에!)
  • MousePoint: 마우스 커서 위치를 기준으로 Popup을 표시하고, HorizontalOffset와 VerticalOffset 속성을 사용하여 조정할 수 있습니다.
  • Left: 기준 요소의 왼쪽에 Popup을 표시합니다.
  • Top: 기준 요소의 위쪽에 Popup을 표시합니다.

사용 방법

<ComboBox x:Name="cbb_{변수명}" SelectedValuePath="Key" DisplayMemberPath="Value">
    <ComboBox.Template>
         <ControlTemplate TargetType="ComboBox">
             <Grid>
                 <ToggleButton Name="ToggleButton"
                       Grid.Column="2"
                       Template="{StaticResource ComboBoxToggleButton}" 
                       Focusable="false"
                       IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                       ClickMode="Press">
                 </ToggleButton>
                 <ContentPresenter Name="ContentSite"
                           IsHitTestVisible="False"
                           Content="{TemplateBinding SelectionBoxItem}"
                           ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                           ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                           Margin="3,3,23,3"
                           VerticalAlignment="Center"
                           HorizontalAlignment="Left">
                 </ContentPresenter>                                
                 <Popup Name="Popup"
                Placement="MousePoint"
                IsOpen="{TemplateBinding IsDropDownOpen}"
                AllowsTransparency="True"
                Focusable="False"
                PopupAnimation="Slide">
                     <Grid Name="DropDown"
                   SnapsToDevicePixels="True"
                   MinWidth="{TemplateBinding ActualWidth}"
                   MaxHeight="{TemplateBinding MaxDropDownHeight}">
                         <Border Name="DropDownBorder"
                         BorderThickness="1"
                         Background="LightBlue">
                             <ScrollViewer Margin="4,6,4,6"
                                   SnapsToDevicePixels="True">
                                 <StackPanel IsItemsHost="True"
                                     KeyboardNavigation.DirectionalNavigation="Contained" />
                             </ScrollViewer>
                         </Border>
                     </Grid>
                 </Popup>
             </Grid>
         </ControlTemplate>
     </ComboBox.Template>
</ComboBox>

 

 

<ComboBox> 안에 추가한다.   

<Popup> 라인을 보면 된다. - Placement 속성을 수정하면되는데, 생략하면 유동적으로 생성된다. 

 

 

1. 디버그 관련

코드 실행 중 이전으로 돌아가고 싶다면 
해당 줄을 우클릭 후 '다음 문 설정'을 클릭하고 F10 누르면 다시 갈 수 있다. 

 

2. 매개변수 전달

에러가 날때 주는 변수의 타입과 받는 쪽의 매개변수 타입이 맞는지 확인해보자!

 

3. itemsource 반복현

itemsource 쓰니까 값들이 반복되서 여러번 나오게 된느 이유는?
 AutoGenerateColumns="False" 
이게 true 였어서;;

 

4. DB 조건 없애는 방법

where ({0}=ALL || {컬럼명}={0}) 

뭐가 문제 일까?

Binding 해서 많은 데이터들은 가져오는게 아닌가? 

 

Nop!  ItemsSource을 사용해서 Binding 해야한다. 

 

.xml 에서 ItemsSource 사용해서 해당 변수들의 상위 grid에서 binding을 추가해줘야한다. 

 

그후 .cs파일에서는 아래와 같이 사용하면 된다. 

public class Binding // 데이터 그리드 바인딩 클래스명
{
    public string Name { get; set; }

    public int Age { get; set; }
}

public ObservableCollection<Binding> BindingList { get; set; } 


public void 생성한 클래스명(){

	BindingList = new ObservableCollection<Binding>();
    
    
    //binding 담는 코드들
    
    BindingList.add();
    
    (.xml 파일에 ItemsSource={Binding BindingList} 한 곳의 x:Name 이름).ItemsSource = BindingList;
    
    
}

 

 

 

 

출처, 참고 자료 : 

https://stackoverflow.com/questions/32257785/bind-the-itemssource-of-a-datagrid-to-a-list

 

Bind the ItemsSource of a DataGrid to a List

I am trying to create a binding between a List and a DataGrid. I haven't found a working Solution in the net which is very strange. In my little example I create a List of objects with the two pu...

stackoverflow.com

 

 

 

갑자기 제대로 된 건데 변수명 인식이 에러 날때

 

솔루션 탐색기 (ctrl + alt + L)

 

프로젝트 우측 클릭 -> 파일 탐색기에서 폴더 열기 (아래에 존재)

obj, bin 파일 삭제하고 다시 빌드하면 된다. 

 

갑자기 이러는 이유에 대해서 생각해 봤는데, 

아마도 .xaml 에서 변수명들을 갑자기 많이 변경해서 얘가 정신이 나가 버린거 아닌가? 라는 예측이 든다.

 

 

둘다 타이머를 설정하는 것. 

화면을 계속해서 갱신(업데이트, 새로고침) 하기 위해서 사용됨.

 

 

 

1. DispatcherTimer

  • WPF (Windows Presentation Foundation) 애플리케이션에서 주로 사용 
  • UI 스레드에서 실행되며, UI 업데이트에 적합 
  • Interval은 TimeSpan 객체로 설정 
  • Tick 이벤트 핸들러는 UI 스레드에서 실행 

 

private DispatcherTimer _Timer;
this._Timer = new DispatcherTimer();
this._Timer.Interval = new TimeSpan(0, 0, 1); // 1초 간격
this._Timer.Tick += _Timer_Tick;
this._Timer.Start();

 

 

 

 

 

2. Timer (System.Windows.Forms.Timer)

 

  • Windows Forms 애플리케이션에서 주로 사용
  • UI 스레드에서 실행되며, 주로 WinForms UI 업데이트에 사용
  • Interval은 밀리초 단위의 정수 값으로 설정
  • Tick 이벤트 핸들러는 UI 스레드에서 실행
Timer timer = new Timer();
timer.Tick += OnTimerTick;
timer.Interval = 10000; // 10초 간격
timer.Start();

 

 

스크롤바가 적용이 안되는 이유

 

 

[나의 잘못된 코드]

<StackPanel>
	  <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
      <Grid>
      </Grid>
</StackPanel>

이런식으로 되어있었다.

(chat gpt가 알려줌. ;;)

 

 

 

 

1. 원인 <StackPanel>

<StackPanel> 에서는 ScrollViewr를 사용할 수 없다!

그래서 나는 그냥 안되는 줄알았는데, 

Grid에 Height="" 를 넣어주면 바로 적용된다.. ㅜ.ㅜ!!!

 

아래 사이트에서는 최대 사이즈 MAX를 설정해 줘야한다는데, 그러면 나는 적용이 안되고, 

그냥 사이즈 Height만 지정해줘도 된다. 

https://forum.dotnetdev.kr/t/wpf-scrollviewer/2907/3

 

WPF scrollviewer 질문입니다.

StackPanel의 경우 속한 컨트롤에 따라 Orientation이 Horizontal일 경우 너비, Vertical일 경우 높이가 속한 컨트롤에 맞춥니다. 공유주신 XAML로 짐작컨데 MaxWidth 또는 MaxHeight를 통해서 ScrollViewer의 최대 사

forum.dotnetdev.kr

 

 

 

 

2. 그냥 Grid만 쓰면 자동으로 나옴. 따로 할 것도 없이!

Grid랑 StackPanel 등 레이아웃들이 ScrollViewr를 기본적으로 셋팅 설정 되어있기 때문에 1번의 사례 빼고는 따로 설정해줄 것이 없다고 한다. 

 

 

 

StackPanel 

자식 요소들을 하나씩 쌓는 레이아웃

즉, 이름 그대로 Stack! 스택에 쌓듯이 요소들이 들어간다. 

<StackPanel>
    <Gird>
    </Gird>
    <Gird>
    </Gird>
<StackPanel>

 

예를 들면 

현재 < StackPanel > 안에 <Gird>가 2개 있다. 

그러면 화면에 

<Grid>

<Grid> 

따로 margin을 안줘도 알아서 층 쌓듣이 들어간다. 

 


 

 

Gird 

행과 열로 이루어진 레이아웃을 만드는 데 사용됩니다.

테이블 형식의 배치가 필요할 때 유용합니다.

이거는 쌓는 개념이 아니라. 존재하는 거다. 

<Gird>
    <Gird>
    </Gird>
    <Gird>
    </Gird>
</Gird>

이렇게 있다면, 

화면에 Gird 요소가 겹친다!

그래서 Margin을 사용해서 위치를 조정해줘야 한다. 

 

 


 

 

Gird로 구역 나누는 방법

[ 예시 코드 ]

<Grid Margin="6">       
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    
     <Grid Grid.Row="0" Margin="20,10,0,0">
        <Grid.ColumnDefinitions>
        <ColumnDefinition Width="50*"/>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="50*"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
        
        
    <Grid Grid.Row="1" Margin="20,10,0,0">
        <Grid.ColumnDefinitions>
        <ColumnDefinition Width="50*"/>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="50*"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
</Grid.RowDefinitions>

 

 

1. 행 나누기 

<Grid.RowDefinitions>
    <RowDefinition Height="50"/>
    <RowDefinition Height="58"/>
</Grid.RowDefinitions>

행이 2개로 나눠진 것이다. 

 
 

 

 

2. 행 안에서 열 구분하기.

Grid.Row="0" 를 사용해서 행을 선택할 수 있다. 

<Grid Grid.Row="0" Margin="20,10,0,0">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50*"/>
    <ColumnDefinition Width="10"/>
    <ColumnDefinition Width="50*"/>
    <ColumnDefinition/>
</Grid.ColumnDefinitions>

ColumnDefinition을 통해서 열을 구분한다. 

 

 
 

2개의 행 중에서 첫번째 행 안에 3개의 열이 존재하게 된다는 것이다. 

     

 


 

실제 사례

코드와 적용된 것을 보면서 이해할 수 있다. 

아직 *에 대해서는 이해가 안간다. 

*는 가변적 인 비율 기반 크기 조정.

 

찾아보니

- 1. 모든 열의 비율 합계를 계산하고, 

- 2. 그리드의 총 가용 너비를 이 합계로 나눈다.

 

그리드의 전체 공간을 비율에 따라 나누어 각 열이나 행에 할당하기에

다양한 해상도와 창 크기에서 올바르게 동작하도록 할 때 유용하다. 

 

<Grid Margin="6">
    <Grid.RowDefinitions>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0"  Background="White"  >
    </Grid>

    <Grid Grid.Row="1" Background="SkyBlue">            
    </Grid>
</Grid>

 

<Grid Margin="6">
    <Grid.RowDefinitions>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0"  Background="White"  >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*"/>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="50*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
    </Grid>

    <Grid Grid.Row="1" Background="SkyBlue">            
    </Grid>
</Grid>

 

 

<Grid Margin="6">
    <Grid.RowDefinitions>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0"  Background="White"  >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*"/>  <!--0-->
            <ColumnDefinition Width="10*"/>  <!--1-->
            <ColumnDefinition Width="50*"/>  <!--2-->
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Grid Grid.Column="0" Background="Black">
        </Grid>
        <Grid Grid.Column="1" Background="Yellow">
        </Grid>
        <Grid Grid.Column="2" Background="Gray">
        </Grid>
    </Grid>

    <Grid Grid.Row="1" Background="SkyBlue">            
    </Grid>
</Grid>

+ Recent posts