I have to do a "grid" like this:
I'm trying to create a ListView
with ItemsSource="List<Note>"
where every odd note in the list is moved on the bottom...
Is the ListView
the right control?
How can I draw an exact hexagon with faces that is near next object?
EDIT: hexagon drawing is solved... this is the xaml:
<Path d:LayoutOverrides="None"
d:LastTangent="0,0" Stroke="Blue" Fill="Red"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Margin="0" Width="100" Height="100" x:Name="Path"
Stretch="Fill"
Data="M8.660254,0 L17.320508,5 17.320508,15 8.660254,20 0,15 0,5 8.660254,0 z"/>
The container for your notes would be an
ItemsControl
or aListBox
if you need to select items. Then you give your items a template usingListBox.ItemTemplate
where you include your hexagon drawing. You have a nice tutorial on Custom ListBox layout.At this point, your hexagons are displayed one below the other as a ListBox does by default. To get your special layout, you have to change the
ListBox.ItemPanel
. Here you have two possibilities:Canvas
panel that supports absolute positioning. In this case your items must have X and Y properties that you will use to position them.Panel
, probably based onCanvas
, that is able to convert your custom coordinate system (for example note name + octave number) into X and Y. A bit more difficult but much more reusable. An example of Custom Panel on CodeProject.HexGrid: CodeProject article
HexGrid: GitHub repository
The key component of a possible solution is a WPF Panel which can arrange hexagonal elements (Standard Panels operate with rectangular child elements). Take a look my HexGrid project (too large to post here). The cental part of it is a
HexGrid
(WPFPanel
which arranges child elements in a honeycomb pattern). Child elements are represented byHexItem
s (hexagon-shaped ContentControls). There is alsoHexList
(selector ItemsControl which displays items in HexItem container on a HexGrid panel) which gives hex selection support out-of-box.example of usage: