<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<ToggleButton x:Name="menuButton" Content="{Binding DisplayText}" Style="{StaticResource TopMenuButton}" IsChecked="{Binding ElementName = menuPopup, Path=IsOpen, Mode=TwoWay}"/>
</StackPanel>
<local:MenuPopup x:Name="menuPopup" Width="{Binding ActualWidth,ElementName=menuButton}" IsOpen="{Binding ElementName=menuButton,Path=IsChecked, Mode=OneWay}"
PlacementTarget="{Binding ElementName=menuButton}" StaysOpen="False"
PopupMenuItemClicked="menuPopup_PopupMenuItemClicked"/>
</Grid>
MenuButton样式
<Style TargetType="ToggleButton" x:Key="TopMenuButton">
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Width" Value="180"/>
<Setter Property="Background" Value="#FF304156"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="#FF2B3A4D"/>
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="border" Property="Background" Value="#FF2B3A4D"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ToggleButton样式
<Grid>
<ListBox x:Name="listBox" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" Background="{StaticResource MenuPopupBackgroud}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="BorderThickness" Value="0.5"/>
<Setter Property="BorderBrush" Value="LightGray"/>
<Setter Property="Height" Value="35"/>
<Setter Property="Foreground" Value="White"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_MouseLeftButtonDown"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="border" CornerRadius="0" >
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Center" Margin="10,0,0,0" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="White" />
<Setter TargetName="border" Property="Background" Value="{StaticResource MenuPopupBackgroud}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="{StaticResource MenuPopuoMouseMove}" />
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
MenuPopup Xaml
public partial class MenuPopup : Popup, INotifyPropertyChanged
{
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PopupMenuItemsProperty = DependencyProperty.Register("PopupMenuItems", typeof(IEnumerable<string>), typeof(MenuPopup), new PropertyMetadata(new PropertyChangedCallback(OnPopupMenuItemsChanged)));
private static void OnPopupMenuItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as MenuPopup;
control.SetListBoxItems();
}
public IEnumerable<string> PopupMenuItems
{
get { return (IEnumerable<string>)GetValue(PopupMenuItemsProperty); }
set { SetValue(PopupMenuItemsProperty, value); }
}
public event EventHandler<string> PopupMenuItemClicked;
public MenuPopup()
{
InitializeComponent();
this.DataContext = this;
}
private void SetListBoxItems()
{
listBox.ItemsSource = PopupMenuItems;
}
private void ListBoxItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.IsOpen = false;
var item = sender as ListBoxItem;
if (item == null)
return;
if (PopupMenuItemClicked != null)
PopupMenuItemClicked(this, item.Content.ToString());
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if(this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
OnPropertyChanged("SelectedIndex");
}
}
}
Menupopup cs 文件
浙公网安备 33010602011771号