WPF menu and header images - wpf

I need to have an image instead of text in my menu header. I have written a code but its not showing up the image.
Following is my xaml part for it.
<Menu Height="50" Width="50" VerticalAlignment="Top" IsMainMenu="True">
<MenuItem Height="50" Width="50">
<MenuItem.Header>
<Image HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Source="Images/pulsesi_icon_black.PNG"/>
</MenuItem.Header>
</MenuItem>
</Menu>
Help me out of it, I don't need an Icon.

you can use Menuitem.Icon for image in header.
<MenuItem >
<MenuItem.Icon>
<Image Width="20" Height="20" Source="/Resources/Images/Key.jpg" />
</MenuItem.Icon>
</MenuItem>

Related

MenuItem with image as header ignores alignment

First of all, I know there are lot of questions about alignment in wpf, and I've read some of them, but none seems to work in this case...
What do I have
I've a menu, where the third MenuItem doesn't have a text but an image. To be exact, this one:
I want this element to be right aligned, so after looking at some examples and problem with alignment questions in SO, I'm using the following code:
<MenuItem HorizontalAlignment="Right" HorizontalContentAlignment="Right">
<MenuItem.Header>
<StackPanel>
<Image Source="Resources/Img/donarBoton.gif" UseLayoutRounding="False" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
Problem
As you can see, even whith the HorizontalAlignment set to right, it doesn't appear on the right side.
I've read about it and found that the Menu where it is, need to have the same property set to Stretch, what I've tried too with no success. I even tried it with the DockPanel where the menu is located (just to try, I'm not used to WPF yet), but it does nothing either.
I've tried to add a text element after my image element too, in order to see if the problem is the MenuItem or any other thing in my configuration, but it didn't move to the right side either.
What am I doing wrong?
There's the full DockPanel code:
<DockPanel x:Name="superiorDock" Height="25" LastChildFill="False" VerticalAlignment="Top" Width="307">
<Menu x:Name="superiorMenu" Width="307" Height="25" DockPanel.Dock="Top" HorizontalAlignment="Stretch" >
<MenuItem Header="{Binding XPath=#topMenu_1}">
<MenuItem Header="{Binding XPath=#topMenu_2}"/>
<MenuItem Header="{Binding XPath=#topMenu_3}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_4}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_5}"/>
</MenuItem>
<MenuItem Header="{Binding XPath=#topMenu_6}">
<MenuItem Header="{Binding XPath=#topMenu_7}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_8}"/>
</MenuItem>
<MenuItem HorizontalAlignment="Right" HorizontalContentAlignment="Right">
<MenuItem.Header>
<StackPanel>
<Image Source="Resources/Img/donarBoton.gif" UseLayoutRounding="False" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
</Menu>
</DockPanel>
Thanks in advance
Use this:
<DockPanel x:Name="superiorDock" Height="25" LastChildFill="False" VerticalAlignment="Top" Width="307">
<Menu x:Name="superiorMenu" Width="307" Height="25" DockPanel.Dock="Top" HorizontalAlignment="Stretch">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Header="{Binding XPath=#topMenu_1}">
<MenuItem Header="{Binding XPath=#topMenu_2}"/>
<MenuItem Header="{Binding XPath=#topMenu_3}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_4}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_5}"/>
</MenuItem>
<MenuItem Header="{Binding XPath=#topMenu_6}">
<MenuItem Header="{Binding XPath=#topMenu_7}"/>
<Separator/>
<MenuItem Header="{Binding XPath=#topMenu_8}"/>
</MenuItem>
<MenuItem HorizontalAlignment="Right">
<MenuItem.Header>
<StackPanel>
<Image Source="Resources/Img/donarBoton.gif" UseLayoutRounding="False" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
</Menu>
</DockPanel>
The default ItemsPanel of the Menu uses a WrapPanel. The panel defined in the ItemsPanel will be used as the container of the MenuItems.
WrapPanel doesn't respect the HorizontalAlignment property of its children. That's why we change the ItemsPanel to one that does support this: DockPanel.

XAML Centering menuitem

So I made a simple menu with a Width of 55 I try to make my title ("FILE") centered within the button itself while still being on the left of the window.
At the moment the basic code looks like that
<Menu Height="25" VerticalAlignment="Top" Width="800" Margin="0">
<MenuItem Header="File" Margin="0" Height="25" Width="55" HorizontalContentAlignment="Center">
<MenuItem Header="Login"/>
<MenuItem Header="New User"/>
...
</MenuItem> </Menu>
I've already tried playing around with a code like
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
To remove the grid but no sucess it's only the actual menu being centered and not the text "FILE" within the button.
Here's an example of what the "FILE" looks like at the moment and I try to make it centered within the blue area.
http://i.stack.imgur.com/KRXw2.png
(Cannot post the actual image I don't have enough rep.)
Thanks.
You an achieve this by setting the MenuItem's header template to be a TextBlock, with the TextBlock being the same width of the MenuItem itself. Also, you will need to add a Margin to compensate for the default MenuItem template.
<Menu Height="25" VerticalAlignment="Top" Width="800" Margin="0">
<MenuItem Margin="0" Height="25" Width="55" HorizontalContentAlignment="Center">
<MenuItem.Header>
<TextBlock Text="File" HorizontalAlignment="Stretch" Margin="-7" Width="55" TextAlignment="Center"/>
</MenuItem.Header>
<MenuItem Header="Login"/>
<MenuItem Header="New User"/>
</MenuItem>
</Menu>

Writing in WPF problems

I'm trying to write for the first time in WPF and I see that I can't manage the icons in the menus.
My Code is that.
<Grid>
<my:RibbonControl Height="49" HorizontalAlignment="Left" Name="RibbonControl1" VerticalAlignment="Top" Width="503" />
<my:Ribbon Name="Ribbon">
<my:RibbonTab Name="Manage" Header="Διαχείριση" KeyTip="m">
<my:RibbonGroup Name="groupadd" Header="Χρήστες">
<my:RibbonSplitButton x:Name="btnUser" LargeImageSource="/Economy;component/Images/users01.png" Width="30" Height="60" TabIndex="1" FontFamily="Palatino Linotype" FontSize="12" FocusedBackground="#FFE2AB7F" LayoutTransform="{Binding}" MaxHeight="120" MaxWidth="80" Margin="1,0,0,1" OverridesDefaultStyle="False" Padding="0" ToolTipFooterTitle="Επιλογή">
<MenuItem Header="Ανάθεση">
<MenuItem.Icon>
<Image Source="/Economy;component/Images/delegation.jpg" Stretch="Fill" Width="20" Height="20"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Διαγραφή">
<MenuItem.Icon>
<Image Source="/Economy;component/Images/deletion.ico" Stretch="Fill" Width="20" Height="20" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Είσοδος">
<MenuItem.Icon>
<Image Source="/Economy;component/Images/login.jpg" Stretch="Fill" Width="20" Height="20"/>
</MenuItem.Icon>
</MenuItem>
<my:RibbonSeparator />
<MenuItem Header="Έξοδος">
<MenuItem.Icon>
<Image Source="/Economy;component/Images/logout.ico" Stretch="Fill" Width="20" Height="20"/>
</MenuItem.Icon>
</MenuItem>
</my:RibbonSplitButton>
</my:RibbonGroup>
</my:RibbonTab>
</my:Ribbon>
</Grid>
this code produces the following
What I need is to have the icons at the most left site of the menu.
I read another question about that... which is
<ribbon:RibbonSplitButton x:Name="SplitButton3DViews"
ItemsSource="{Binding items}"
Label="Views3D"
IsCheckable="False" >
<ribbon:RibbonSplitButton.Resources>
<Style TargetType="{x:Type ribbon:RibbonMenuItem}">
<Setter Property="Header" Value="{Binding Path=Name}" />
<Setter Property="Command" Value="{Binding Path=cmd}" />
<Setter Property="ImageSource" Value="{Binding Icon}" />
</Style>
</ribbon:RibbonSplitButton.Resources>
</ribbon:RibbonSplitButton>
But it is not working with my page...
Is there some one to assist me on this?
First of all, please state which ribbon control library you are using, as <my:Ribbon> is not part of the built-in .NET framework.
Secondly, I think that <MenuItem> is the wrong element to use inside your ribbon control.
According to this webpage:
http://www.renevo.com/blogs/dotnet/archive/2009/02/10/your-first-wpf-ribbon-application.aspx
a RibbonApplicationMenuItem should be used instead, no mention of MenuItem anywhere. You might not be using the same ribbon control as shown in the webpage, but I'm guessing that your ribbon control requires another element instead of Menuitem.

Resizing Icon of MenuItems in WPF

How to resize the icon of the menu and menuitems in WPF C#
I have done following
<DockPanel>
<Menu Background="CadetBlue" Height="53" Width="500" IsMainMenu="True" DockPanel.Dock="Top" VerticalAlignment="Top">
<MenuItem Padding="40,0,0,0" Header="File" Foreground="#FF383131" FontSize="20" Background="Beige" Width="100" Height="50" >
<MenuItem.Icon>
<Image Source="/WPFMenuItem;component/Images/garden.jpg" Stretch="Uniform"/>
</MenuItem.Icon>
<MenuItem Header="New" FontSize="20">
<MenuItem.Icon>
<Image Source="/WPFMenuItem;component/Images/garden.jpg" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Exit" FontSize="20">
<MenuItem.Icon>
<Image Source="/WPFMenuItem;component/Images/ic_launch_man.png" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>
<TextBox />
</DockPanel>
I have increased width,height and margin but did not work?
Try using a render transform and set the X and Y scale.
http://msdn.microsoft.com/en-us/library/ms750596(v=vs.110).aspx
<Image Source="/WPFMenuItem;component/Images/garden.jpg" Stretch="Uniform" RenderTransformOrigin="0.5,0.5">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform X="2" Y="3.7"/>
</TransformGroup>
</Image.RenderTransform>
</Image>

Center header in menu control

How do I vertically center a header in the menu control?
This was my try:
<MenuItem Header="File" StaysOpenOnClick="True" FontFamily="Arial" VerticalAlignment="Center">
<MenuItem Header="Open" Click="Open_Click" IsEnabled="True"/>
</MenuItem>
</Menu>
But its aligned to the Top-left.
What am I doing wrong?
[EDIT]
My whole menu now looks like this:
<Menu Canvas.Left="0" Canvas.Top="0" Name="menu1" Margin="0,0,0,384">
<MenuItem Header="File" StaysOpenOnClick="True" FontFamily="Arial" VerticalAlignment="Center">
<MenuItem Click="Open_Click" IsEnabled="True">
<MenuItem.Header>
<TextBlock Text="Open" VerticalAlignment="Center"/>
</MenuItem.Header>
</MenuItem>
</MenuItem>
</Menu>
The header text 'file' still isn't vertically centered (which is what i want to center).
What exactly is this code centering? Is it the text 'open'?
[/EDIT]
If you want to format the header you'll need to explicitly layout the header control:
<MenuItem StaysOpenOnClick="True" FontFamily="Arial" VerticalAlignment="Center">
<MenuItem Click="Open_Click" IsEnabled="True">
<MenuItem.Header>
<TextBlock Text="Open" VerticalAlignment="Center"/>
</MenuItem.Header>
</MenuItem>
</Menu>
Update:
To format the position of a MenuItem in the Menu you'll need to override the Menu's ItemsPanelTemplate. By default the Menu uses a vertical WrapPanel which justifies the items to the top. Replace the default with a panel of your choice (StackPanel, Grid, DockPanel, etc) and you'll be able center the menu items as you please. Here's an example:
<Menu Canvas.Left="0" Canvas.Top="0" Name="menu1" Margin="0,0,0,384">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Header="File" StaysOpenOnClick="True" FontFamily="Arial" VerticalAlignment="Center" >
<MenuItem Header="Open" Click="Open_Click" IsEnabled="True"/>
</MenuItem>
</Menu>
Information gathered from this post on MSDN.
I think you would want to set the VerticalContentAlignment. If the aligmnet is still not to your liking there is probably a problem with the default MenuItem Template, it may not bind to the property or there are some margins or Paddings which shift the header.

Resources