Skip to content

Repository files navigation

GridExtra

GridExtra is a custom panel library for WPF/UWP.

  • ResponsiveGrid
    • Custom Panel class that provides bootstrap like grid system.
    • Grid system
      • switch layout with window width.
        • XS(<768px), SM(<992px), MD(<1200px), LG(1200px<=)
      • 12 columns across the page.(customizable with MaxDivision property)
  • GridEx
    • Helper class that defines usefull attached properties for Grid panel.
  • WrapPanelEx
    • Helper class that provide adaptive layout for WrapPanel.

install

Nuget Package

Install-Package GridExtra

https://www.nuget.org/packages/GridExtra/

Preparation

Add xmlns to xaml code.

For WPF

xmlns:ge="clr-namespace:SourceChord.GridExtra;assembly=GridExtra.Wpf"

For UWP

xmlns:ge="using:SourceChord.GridExtra"

Usage

ResponsiveGrid

ResponsiveGrid provides the grid layout system that is similar to Bootstrap framework.

demo

Example

 <Grid>
<Grid.Resources>
<StyleTargetType="{x:Type Border}">
<SetterProperty="BorderBrush"Value="Black" />
<SetterProperty="BorderThickness"Value="1" />
<SetterProperty="Background"Value="LightGray" />
<SetterProperty="Height"Value="60" />
</Style>
</Grid.Resources>
<rg:ResponsiveGrid>
<Border ge:ResponsiveGrid.XS="12" ge:ResponsiveGrid.SM="3" />
<Border ge:ResponsiveGrid.XS="12" ge:ResponsiveGrid.SM="6" />
<Border ge:ResponsiveGrid.XS="12" ge:ResponsiveGrid.SM="3" />
</rg:ResponsiveGrid>
</Grid>

extra small device(~768px)
extra small device

small device(~992px)
small device

Properties

Dependency Properties
Property NameTypeDescription
MaxDivisionintGets or sets a value that determines grid divisions.
BreakPointsBreakPoints class
ShowGridLinesintGets or sets a value that indicates whether grid column's lines are visible within this ResponsiveGrid.
Attached Properties
Property NameTypeDescription
XS
SM
MD
LG
intGets or sets a value that determines grid columns for XS(extra small), SM(small), MD(medium), LG(large) devices.
XS_Offset
SM_Offset
MD_Offset
LG_Offset
intGets or sets a value that determines grid columns offset for XS(extra small), SM(small), MD(medium), LG(large) devices.
XS_Push
SM_Push
MD_Push
LG_Push
intGets or sets a value that moves columns to right from the original position.
XS_Pull
SM_Pull
MD_Pull
LG_Pull
intGets or sets a value that moves columns to left from the original position.
Compared to bootstrap
bootstrapResponsiveGrid
col-xs
col-sm
col-md
col-lg
XS
SM
MD
LG
col-xs-offset
col-sm-offset
col-md-offset
col-lg-offset
XS_Offset
SM_Offset
MD_Offset
LG_Offset
col-xs-push
col-sm-push
col-md-push
col-lg-push
XS_Push
SM_Push
MD_Push
LG_Push
col-xs-pull
col-sm-pull
col-md-pull
col-lg-pull
XS_Pull
SM_Pull
MD_Pull
LG_Pull
visibility-xs, visibility-sm,…
hidden-xs, hidden-sm,...
(T.B.D.)

attention

ResponsiveGrid is not suitable for ItemsPanel, because it isn't implemented VirtualizingPanel class.

If you use ResponsiveGrid in ListBox as ItemsPanel. Your ListBox become to not virtualize items of ListBox.

GridEx

GridEx is Helper class for defining Grid properties.

demo

Example1 (Row/Column Definition)

 <Grid ge:GridEx.RowDefinition="*, *, *, *"
ge:GridEx.ColumnDefinition="50, 75, *, 2*"ShowGridLines="True">
<Button Grid.Row="1"
Grid.Column="2"Margin="5"Content="Button" />
</Grid>

Example1

Row/Column Definition with Min/Max size
 <Grid ge:GridEx.RowDefinition="*, *, *, *"
ge:GridEx.ColumnDefinition="50, *(50-200), 2*(80-), 2*(-300)"ShowGridLines="True">
<Button Grid.Row="1"
Grid.Column="2"Margin="5"Content="Button" />
</Grid>

ge:GridEx.ColumnDefinition="50, *(50-200), 2*(80-), 2*(-300)" is similar to below definition.

 <Grid.ColumnDefinitions>
<ColumnDefinitionWidth="50"/>
<ColumnDefinitionWidth="*"MinWidth="50"MaxWidth="200"/>
<ColumnDefinitionWidth="2*"MinWidth="80"/>
<ColumnDefinitionWidth="2*"MaxWidth="300"/>
</Grid.ColumnDefinitions>

Example2 (Area Definition)

Area property provides the way of defineing Row/Column/RowSpan/ColumnSpan.

 <Grid ge:GridEx.RowDefinition="*, *, *, *"
ge:GridEx.ColumnDefinition="*, *, *, *"ShowGridLines="True">
<ButtonMargin="5"
ge:GridEx.Area="0, 0, 1, 2"Content="GridEx.Area=&quot;0, 0, 1, 2&quot;" />
<ButtonMargin="5"
ge:GridEx.Area="2, 1, 2, 3"Content="GridEx.Area=&quot;2, 1, 2, 3&quot;" />
</Grid>

Example2

Example3 (Named Template Area)

TemplateArea provides named grid areas, like CSS Grid Layout Module Level 1.
TemplateArea property makes row/column definition. And, define region's name.

Children of Grid can be placed with region's name, that is defined by TemplateArea property.

 <Grid ge:GridEx.TemplateArea=" Header Header Header &#10; Menu Content SubMenu &#10; Footer Footer Footer &#10;"ShowGridLines="True">
<ButtonMargin="5"
ge:GridEx.AreaName="Header"Content="Header" />
<ButtonMargin="5"
ge:GridEx.AreaName="Menu"Content="Menu" />
<ButtonMargin="5"
ge:GridEx.AreaName="Content"Content="Content" />
<ButtonMargin="5"
ge:GridEx.AreaName="SubMenu"Content="SubMenu" />
<ButtonMargin="5"
ge:GridEx.AreaName="Footer"Content="Footer" />
</Grid>

Example3

Row devision is defined by line feed or /.

  • line feed
    • \n(.cs)
    • &#10;(xaml)
  • /
 <Grid ge:GridEx.TemplateArea=" Header Header Header/ Menu Content SubMenu/ Footer Footer Footer/">

Example4 (Named Template Area, working with RowDefinition/ColumnDefintion)

 <Grid ge:GridEx.RowDefinition="50, *, 30"
ge:GridEx.ColumnDefinition="*, 2*, 100"
ge:GridEx.TemplateArea=" Header Header Header/ Menu Content SubMenu/ Footer Footer Footer/"ShowGridLines="True">
<ButtonMargin="5"
ge:GridEx.AreaName="Header"Content="Header" />
<ButtonMargin="5"
ge:GridEx.AreaName="Menu"Content="Menu" />
<ButtonMargin="5"
ge:GridEx.AreaName="Content"Content="Content" />
<ButtonMargin="5"
ge:GridEx.AreaName="SubMenu"Content="SubMenu" />
<ButtonMargin="5"
ge:GridEx.AreaName="Footer"Content="Footer" />
</Grid>

Example4

Attached Properties(for Grid)
Property NameTypeDescription
RowDefinitionstringSets a value that determines row definition of Grid.
ColumnDefinitionstringSets a value that determines column definition of Grid.
TemplateAreastringSets a definition of grid devision and area names.
Attached Properties(for Grid children)
Property NameTypeDescription
AreastringSets a value that determines Row, Column, RowSpan, ColumnSpan properties.
AreaNamestringSets a name of regions for item's belong.(use with TemplateArea property)

Example5 (Auto fill children)

demo2

Attached Properties(for Grid)
Property NameTypeDescription
AutoFillChildrenstringGets or sets a value that indicates whether the Grid arranges its children to each cell.
AutoFillOrientationstringSets a value that determines auto fill orientation.
Attached Properties(for Grid children)
Property NameTypeDescription
AutoFillSpanstringSets a value that determines cell span value that is used during AutoFill process.
 <Grid ge:GridEx.ColumnDefinition="*, *"
ge:GridEx.RowDefinition="Auto, Auto, Auto"
ge:GridEx.AutoFillChildren="True"ShowGridLines="True">
<TextBlockText="Name:" />
<TextBoxVerticalAlignment="Top"Margin="5"/>
<TextBlockText="Age:" />
<TextBoxVerticalAlignment="Top"Margin="5"/>
<Button ge:GridEx.Area="2, 1, 1, 1"Margin="5"Width="60"HorizontalAlignment="Right"Content="OK" />
</Grid>

Example5

AutoFillChildren with Hidden/Collapsed items
 <Grid ge:GridEx.ColumnDefinition="*, *, *"
ge:GridEx.RowDefinition="*, *"
ge:GridEx.AutoFillChildren="True">
<ButtonContent="1"Visibility="Hidden"/>
<ButtonContent="2" />
<ButtonContent="3" />
<ButtonContent="4" />
<ButtonContent="5"Visibility="Collapsed" />
<ButtonContent="6" />
</Grid>

Example5_1

AutoFillChildren with pinned items
 <Grid ge:GridEx.ColumnDefinition="*, *, *"
ge:GridEx.RowDefinition="*, *"
ge:GridEx.AutoFillChildren="True">
<ButtonContent="1" />
<ButtonContent="2" />
<ButtonContent="3" />
<ButtonContent="4" />
<ButtonContent="Fixed Item" ge:GridEx.Area="0,1,1,1"/>
</Grid>

Example5_2

WrapPanelEx (WPF Only)

WrapPanelEx is Helper class that provide adaptive layout for WrapPanel.

demo

Example1

WrapPanelEx.AdaptiveLayout property makes WrapPanel into UWP Community Toolkit's AdaptiveGridView like layout.

 <Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinitionHeight="Auto"/>
</Grid.RowDefinitions>
<WrapPanelItemWidth="200"ItemHeight="70"Orientation="Horizontal"
ge:WrapPanelEx.AdaptiveLayout="{Binding IsChecked, ElementName=chkIsAdaptive}">
<Button />
<Button />
<Button />
<Button />
<Button />
<Button />
<Button />
</WrapPanel>
<CheckBoxx:Name="chkIsAdaptive"
Grid.Row="1"Margin="5"Content="WrapPanelEx.AdaptiveLayout"/>
</Grid>

Lisence

MIT

About

Custom panel controls for WPF/UWP.

Topics

Resources

Stars

214 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages