views:

190

answers:

3

I have the following (simplifed) section in my XAML file:

<Menu Width="Auto" Height="20" Background="#FFA9D1F4" DockPanel.Dock="Top">
    <MenuItem Header="File">
        <MenuItem Header="Exit"/>
    </MenuItem>
    <MenuItem Header="Edit">
        <MenuItem Header="Cut"/>
    </MenuItem>
    <MenuItem Header="Help">
        <MenuItem Header="About"/>
    </MenuItem>
</Menu>

and it results in:

+-------------------------------------------+
| File Edit Help                            |
+-------------------------------------------+
|                                           |

What do I need to do if I want the Help menu item on the right-hand side:

+-------------------------------------------+
| File Edit                            Help |
+-------------------------------------------+
|                                           |
+1  A: 

Hi. I don't think there is an easy way. Menu keeps all Items on one side and even ignores HorizontalContentAlignment of the Menu or HorizontalAlignment of the MenuItem.

But you could do a workaround. The margin property works. So i think you could bind the margin of the Help MenuItem to the width of the Menu. But you would have to use a Converter to calculate the margin from the width.

I dont know if its good to do something like that. I wouldn't. But if you really want it, thats a way that should work.

Marks
Thanks for the advice, _especially_ that last sentence. After doing it, it turned out to not look so good so I think I'll join you in future with that "I wouldn't" comment. +1.
paxdiablo
+2  A: 

Another possible answer, if you always know how many menu items there will be (and that makes this answer fragile), is to define the Menu.ItemsPanel as a grid, set the Menu to Stretch, set the Grid.ColumnDefinitions appropriately, set the MenuItems to the appropriate Grid.Column, and set the HorizontalAlignment of the last menu item as Right.

   <Menu  Height="20" Background="#FFA9D1F4" DockPanel.Dock="Top" HorizontalAlignment="Stretch">
        <Menu.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </Menu.ItemsPanel>
        <MenuItem Header="File" Grid.Column="0">
            <MenuItem Header="Exit"/>
        </MenuItem>
        <MenuItem Header="Edit" Grid.Column="1">
            <MenuItem Header="Cut"/>
        </MenuItem>
        <MenuItem Header="Help" Grid.Column="2" HorizontalAlignment="Right">
            <MenuItem Header="About"/>
        </MenuItem>
    </Menu>
Wonko the Sane
Note that you need to define the maximum number of menu items as the number of ColumnDefinitions. That way, if some menu items are set to Visible.Collapsed, the menu will still be displayed properly, as the ColumnDefinitions are set to Auto width.
Wonko the Sane
This answer is good but in my opinion Leom Burke's answer is better. DockPanel is more efficent than Grid too.
Ray Burns
+5  A: 

Alng the same principle and this time you dont need the grid and therefore dont need to know the number of items. Assign all items to the left except the help :)

<Menu Height="20" Background="#FFA9D1F4">
            <Menu.ItemsPanel>
                <ItemsPanelTemplate>
                    <DockPanel HorizontalAlignment="Stretch"/>
                </ItemsPanelTemplate>
            </Menu.ItemsPanel>
            <MenuItem Header="File">
                <MenuItem Header="Exit"/>
            </MenuItem>
            <MenuItem Header="Edit">
                <MenuItem Header="Cut"/>
            </MenuItem>
                <MenuItem Header="Help" HorizontalAlignment="Right">
                    <MenuItem Header="About"/>
                </MenuItem>
        </Menu>
Leom Burke
Excellent point. I generally use DockPanels sparingly in my code, so I just didn't think of it.Of course, if you were to use this approach, you could add a Style for MenuItem in Menu.Resources to set DockPanel.Dock to a value of Left, and then you'd only need to put the DockPanel.Dock="Right" on the last MenuItem. But @paxdiablo - I agree - the end result certainly has a retro feel to it... :)
Wonko the Sane
I have just edited the above - it turns out that if you have the Stretch on the DockPanel and HorizontalAlignment on the MenuItem then you dont need the explicit dock properties.
Leom Burke
this is better than accepted answer - "less mess" solution; there is an issue though with multi-line menu when window width is less than required to show all menu items.
DK