WPF Как отловить событие ContextMenuClosing - PullRequest
3 голосов
/ 04 марта 2011

У меня есть следующий XAML:

<Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="20"/>
        </Grid.ColumnDefinitions>            
        <local:DropDownButton 
            HorizontalAlignment="Right"
            Grid.Column="2"
            Width="18"
            Style="{StaticResource OrangeButton}"   
            ContextMenuClosing="colorPallete_ContextMenuClosing"
            x:Name="btnSelectColor">            
            <Polygon Points="0,0,5,4,10,0" Fill="Black"/>                                              
            <local:DropDownButton.DropDown>
                <ContextMenu StaysOpen="True" Name="colorPallete" ContextMenuClosing="colorPallete_ContextMenuClosing">
                    <MenuItem StaysOpenOnClick="True" OverridesDefaultStyle="True" ContextMenuClosing="colorPallete_ContextMenuClosing">
                        <MenuItem.Header>
                            <local:ColorPickerPopup x:Name="colorPicker" ContextMenuClosing="colorPallete_ContextMenuClosing"/>
                        </MenuItem.Header>                                                
                    </MenuItem>                                            
                </ContextMenu>                                        
            </local:DropDownButton.DropDown>
        </local:DropDownButton>            

        <Rectangle Width="17.5" Stroke="Black" Margin="0" 
                   Fill="{DynamicResource CheckerBrush}"/>            

        <Rectangle Width="17.5" Margin="0" Name="rtcColorPreview" />
        <TextBox Margin="2,0,0,0" Grid.Column="1" 
                 Width="100" BorderThickness="0"                     
                 Text="{Binding ElementName=colorPicker, Mode=TwoWay,  Path=SelectedColorName}"/>

    </Grid>

Обработчик события colorPallete_ContextMenuClosing не вызывается, когда закрывается ContextMenu с меткой colrPallete. Я не могу понять, чего не хватает.

Пожалуйста, помогите! ТИА.

1 Ответ

2 голосов
/ 04 марта 2011

Согласно документации MSDN ...

ContextMenu само по себе является FrameworkElement производный класс, но событие ContextMenuClosing не будет быть поднятым контекстным меню напрямую. Вместо этого событие поднимается из элемент, который "владеет" контекстным меню как собственность и поднимается только тогда, когда пользователь пытается закрыть контекст меню в интерфейсе пользователя.

Вам нужно будет настроить свой код так, чтобы обработчик определялся исключительно на DropDownButton, как вы это сделали. Если есть вложенный ContextMenu, то вложенный ContextMenu явно вызовет событие.

<local:DropDownButton ContextMenuClosing="colorPallete_ContextMenuClosing">
        ...                             
</local:DropDownButton>

При использовании Button это будет выглядеть так ...

<Button ContextMenuClosing="ContextMenu_ContextMenuClosing">
    <Button.ContextMenu>
        <ContextMenu>
             <MenuItem Header="Go"/>
        </ContextMenu>
    </Button.ContextMenu>
 </Button>

.. где, когда ContextMenu, содержащий MenuItem, закрывается; событие будет вызвано, и будет вызван обработчик.

Не уверен, какой DropDownButton элемент управления вы используете, поэтому я не могу комментировать, что такое свойство DropDown и как вы вкладываете свой ContextMenu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...