Search code examples
c#mahapps.metroflyout

Flyout c# using mahapps


Hello I am currently using library Mahapps but I have some problems. How can I pop out the flyout when clicking the "Menu 1" MenuItem? I tried with the following code but it did not work.

<ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem x:Name="FlyoutOverview" Header="Menu 1" IsCheckable="True" Click="flyoutOverview">
                    <MenuItem.Icon>
                        <iconPacks:PackIconModern Kind="GlobeWire"/>
                    </MenuItem.Icon>
                </MenuItem>
                <Separator/>
                <MenuItem Header="Menu 2"/>
                <Separator/>
                <MenuItem Header="Menu 3">
                    <MenuItem.Icon>
                        <iconPacks:PackIconModern Kind="People"/>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="Menu 4">
                    <MenuItem.Icon>
                        <iconPacks:PackIconModern Kind="UserDelete"/>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="Menu 5">
                    <MenuItem.Icon>
                        <iconPacks:PackIconModern Kind="ControlResume"/>
                    </MenuItem.Icon>
                </MenuItem>
            </ContextMenu>
        </ListBox.ContextMenu>
    </ListBox>

Solution

  • If you have followed the tutorial links I provided then I suppose you are able to create a simple View and its ViewModel.

    The View can be a Window and has its Grid content like this:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
    
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
    
        <Controls:FlyoutsControl Grid.Column="1">
            <Controls:Flyout x:Name="yourMahAppFlyout" Header="Flyout" Background="AliceBlue" Position="Right" Width="350" 
                             IsOpen="{Binding ElementName=FlyoutOverview, Path=IsChecked}">
                <TextBlock Text="My Flyout is here" />
            </Controls:Flyout>
        </Controls:FlyoutsControl>
    
        <ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding NameList}">
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem x:Name="FlyoutOverview" Header="Menu 1" IsCheckable="True" 
                              IsChecked="{Binding IsMenuItem1Checked}">
                        <MenuItem.Icon>
                            <iconPacks:PackIconModern Kind="GlobeWire"/>
                        </MenuItem.Icon>
    
                    </MenuItem>
                    <Separator/>
                    <MenuItem Header="Menu 2"/>
                    <Separator/>
                    <MenuItem Header="Menu 3">
                        <MenuItem.Icon>
                            <iconPacks:PackIconModern Kind="People"/>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="Menu 4">
                        <MenuItem.Icon>
                            <iconPacks:PackIconModern Kind="UserDelete"/>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="Menu 5">
                        <MenuItem.Icon>
                            <iconPacks:PackIconModern Kind="ControlResume"/>
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </ListBox.ContextMenu>
        </ListBox>
    </Grid>
    

    The ViewModel can have these properties:

        public MainWindowViewModel()
        {
            NameList = new ObservableCollection<string>()
            {
                "John", "Micheal", "Jack"
            };
        }
    
        public ObservableCollection<string> NameList { get; set; }
    
        public bool IsMenuItem1Checked
        {
            get { return _isMenuItem1Checked; }
            set { SetProperty(ref _isMenuItem1Checked, value); }
        }
    

    The first menu item in the listbox binds its "IsChecked" property to "IsMenuItem1Checked" in ViewModel, and FlyOut "IsOpen" property binds to "IsChecked" of that menu item.