WPF Template에 Grid 사용하기( UniformGrid, Grid, WrapPanel)

상식적으로
WrapPanel에 Orientation을 수평으로 하고 객체를 추가하면 차례대로 wrap되면서 객체가 추가되어야 한다. Grid는 Row나 Column 을 define 해놓지 않으면 Grid크기로 strech되기 때문에 RowDefinition등을 사용해서 matrix를 만든다.

그럼... WrapPanel에 템플릿을 사용해 버튼을 그리면? 당연히 차례대로 들어갈거라 생각했는데 첫번째줄, 두번째줄.... 하나씩 들어간다. 이건뭐... StackPanel 도 아니고.. 아직 WPF에 대한 이해가 부족한 것 같다.(책을 읽다가 말아서 이 고생을 하는것 같다.)

MSDN을 보면 ItemsPanel을 사용해서 내가 구현하고자 하는걸 비슷하게 해놓았더라.
덕분에 ItemsPanel이란 검색어를 획득(?)해서 구글링 해보았더니 딱 원하는게 나왔다.


<ItemsControl ItemsSource="{Binding Path=PositionList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="12" Columns="4" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate >
            <TextBlock Text="{Binding State}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>



public class PositionInfo
{
    public int Row
    { get ; set ; }
    public int Column
    {
        get ;
        set ;
    }
    public string State
    {
        get ;
        set ;
    }
}
바로 밑에 명쾌한 답변이 있었다.

<ItemsControl>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Row" Value="{Binding Row}"/>
            <Setter Property="Grid.Column" Value="{Binding Column}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    ...</ItemsControl>
 안된다.... ㅠ 삽질하다가 결굴 Grid 를 써서 아래처럼 했다.
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>


결론은 원하는 칸에 객체를 넣을려면 UniformGrid 대신 Grid를 써야한다.

댓글

이 블로그의 인기 게시물

C#에서 포인터 사용

WPF RichTextBox 와 Document의 바인딩

WPF 이미지위에 라인 그리기(WPF DrawLine on exist Image)