2016-11-20 2 views
0

Я пытаюсь создать несколько сложный элемент меню, который позволит пользователю создать новый класс. Проблема, в которой я запускаю, заключается в том, что когда я нажимаю на числовое вверх (из инструментария xceed), что элемент меню закрывается, даже если свойство StaysOpenOnClick установлено в true.Как я могу открыть элемент подменю меню?

Пользователям это не понравится.

Чтобы воспроизвести, создать проект WPF и добавить Extended WPF Toolkit через NuGet, то падение следующий код в свой класс MainWindow:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WhyDoesMyMenuItemCloseWhenClicked" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
    mc:Ignorable="d" 
    x:Class="WhyDoesMyMenuItemCloseWhenClicked.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="21"/> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Menu FontWeight="Bold"> 
      <MenuItem Header="_File"> 
       <MenuItem StaysOpenOnClick="True"> 
        <Grid Height="50" Width="50"> 
         <xctk:IntegerUpDown/> 
        </Grid> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

Когда я нажимаю текстовое поле целого числа вверх-вниз, меню закрывается.

Почему это происходит? Как я могу сделать это НЕ случилось?

+0

При вводе в текстовое поле, там больше происходит, чем просто щелчком мыши. Элемент, отличный от меню, получает полный захват/фокус клавиатуры, что, вероятно, вызывает совершенно другую цепочку событий. Вы можете попробовать перехватить изменения в IsSubMenuOpen и отменить или изменить их, но мои попытки привели к неприемлемому поведению. Хотя это и было, на самом деле, оставаться открытым. – Daniel

+0

Что-то еще, вы можете попробовать извлечь шаблон MenuItem для ресурса и заменить его (в popup) на переменную, которую вы контролируете: IsOpen = "{Binding IsSubmenuOpen, RelativeSource = {RelativeSource TemplatedParent}}" – Daniel

+0

Да, даже заставляя все дерево меню оставаться открытым все же приводит к неприемлемому поведению. Некоторая часть меню сильно отрывает фокус от текстового поля. Это немного больше, чем я готов расследовать в воскресенье, но я желаю вам удачи. Я надеюсь, что это помогло вам в чем-то. – Daniel

ответ

0

Я выяснил решение. Это своего рода ужасно хакерское решение, но оно хорошо справляется с работой:

Изменение заключается в том, что вы создаете MenuItem в пределах MenuItem. Затем вы определяете свой контроль в пределах объекта MenuItem.Header и устанавливаете для MenuItem значение StaysOpenOnClick.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WhyDoesMyMenuItemCloseWhenClicked" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
    mc:Ignorable="d" 
    x:Class="WhyDoesMyMenuItemCloseWhenClicked.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="21"/> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Menu FontWeight="Bold"> 
      <MenuItem Header="_File" StaysOpenOnClick="True"> 
       <MenuItem Header="_StaysOpenOnClick"> 
        <MenuItem StaysOpenOnClick="True"> 
         <MenuItem.Header> 
          <xctk:IntegerUpDown/> 
         </MenuItem.Header> 
        </MenuItem> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 
-1

вы можете использовать StaysOpenOnClick собственности для достижения этой

+0

Попробуйте. Это не работает. Вы должны создать свой контент в заголовке элемента меню и поместить этот пункт меню в пункт меню, который вы хотите оставаться открытым. При установке свойства вложенного пункта меню значение «Истина» выполнит желаемый эффект в соответствии с моим ответом выше. – Will