I have a window with tab control and number of pages - tab items. Each tab item has same grid layout - 6 rows and 4 columns. Now, each tab item contains grid with row and column definitions, so almost half of XAML is definition of grids.
How can I define this grid in one place and reuse that definition in my application? Template? User control?
Besides 6x4, I have only two more grid dimensions that repeat: 8x4 and 6x6.
Edit:
Forgot to mention: controls in grid are different for each tab. I just want to have grid defined once in some resource so that I can reuse them on different tab pages. Now XAML looks like this:
<TabControl>
<TabItem Header="Property">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!-- some controls here -->
</Grid>
</TabItem>
<TabItem Header="Style">
<Grid >
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!-- some controls here -->
</Grid>
</TabItem>
... and this repeats for several more tab items
</TabControl>
This grid definition repeats for each tab item on the form. It annoys me that half of XAML is grid definition.
Is there a way to define this grid at one place and then reuse that definition?
You can do it but it requires some work:
1) Create a collection and an attached property like this:
2) Then you can use it as a resource and in a style for grid like this: Note that
x:Shared="False"
must be used. If not the same definition will be added to many grids causing WPF to throw.Usually one would write a DataTemplate for the data that goes into the Tabs. That DataTemplate would contain the Grid.
Or you could just inherit from Grid...
And then use that instead of your normal Grid.
I had something similiar. question is how do you wan't to put your data into the grids?
As you use the same layout over and over again I guess you are putting similiar things to each cell.
I created a custom ItemsControl for each Tab to put the Data into and then created a style for the ItemsControl that showed the grid.
and in the window
then each CustomControl inheriting from ItemsControl
This is very similiar to what Aelij is doing except I set the ContentPresenter and bind it to a name and put the itemsControl in it's own thing (you can mix both solutions).
It still is alot of code but I would say you save yourself all the Row and Column definitions all the time and you also only have to change the grid at one place if you have to modify it somewhat.
The best way in my opinion would be to use
ItemsControl
with anItemsPanelTemplate
, since you need a container for multiple items:If I were you, I would create a
UserControl
or a customControl
with the repeated code, and then just consume that control from the current code.Another approach would be to use a
DataTemplate
or aControlTemplate
.Creating a
ControlTemplate
for theTabItem
s would also work great.