none
WPF Стиль для ContextMenu RRS feed

  • Вопрос

  • Доброго времени суток, подскажите пожалуйста как привязать стиль к контекстному меню которое создается из элементов коллекции:

    Контекстное меню выглядит так:

    <StackPanel Orientation="Horizontal">
                        <StackPanel.ContextMenu>
                            <ContextMenu ItemsSource="{Binding ContextMenu, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                                <ContextMenu.ItemTemplate>
                                    <HierarchicalDataTemplate ItemsSource="{Binding ContextMenu, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                                    </HierarchicalDataTemplate>
                                </ContextMenu.ItemTemplate>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
    </StackPanel>

    Код класса в коллекции ContextMenu:

    public class ContextMenuItem : INotifyPropertyChanged
        {
    
            private Image _Imag;
            public ICommand _Command;
            public string _Text;
    
            public ContextMenuItem()
            {
                ContextMenu = new ObservableCollection<ContextMenuItem>();
            }
    
            /// <summary>
            /// Иконка меню
            /// </summary>
            public virtual Image Image { get { return _Imag; } set { _Imag = value; OnPropertyChanged("Image"); } }
            /// <summary>
            /// Команда меню
            /// </summary>
            public virtual ICommand Command { get { return _Command; } set { _Command = value; OnPropertyChanged("Command"); } }
            /// <summary>
            /// Имя меню
            /// </summary>
            public virtual string Text { get { return _Text; } set { _Text = value; OnPropertyChanged("Text"); } }
            
            public ObservableCollection<ContextMenuItem> ContextMenu { get; set; }
    
            #region INotifyPropertyChanged
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
    
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            #endregion
        }

    Я пытаюсь привязать имя картинку и команду к элементу меню с помощью стиля но объявление его в ресурсах окна не помогает. Стиль выглядит так:

    <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Header" Value="{Binding Text}"/>
                    <Setter Property="Command" Value="{Binding Command}"/>
                    <Setter Property="Icon" Value="{Binding Image}"/>
    </Style>

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

     
    12 августа 2016 г. 12:58

Ответы

  • Добрый день.

    К вас создаются ContextMenuItem, а стиль на MenuItem. Попробуйте поменять. Ну и нет никаких проблем создать биндинг из кода или, что более правильно, дать стилю имя, при создании пункта меню найти этот стиль из кода и указать его явно пунктам меню. Как то так это будет выглядеть:

    Style style = this.FindResource("MyStyle") as Style;
    cmi.Style = style;

    • Помечено в качестве ответа Snak2013 16 августа 2016 г. 8:49
    16 августа 2016 г. 6:02
    Отвечающий

Все ответы

  • Добрый день.

    К вас создаются ContextMenuItem, а стиль на MenuItem. Попробуйте поменять. Ну и нет никаких проблем создать биндинг из кода или, что более правильно, дать стилю имя, при создании пункта меню найти этот стиль из кода и указать его явно пунктам меню. Как то так это будет выглядеть:

    Style style = this.FindResource("MyStyle") as Style;
    cmi.Style = style;

    • Помечено в качестве ответа Snak2013 16 августа 2016 г. 8:49
    16 августа 2016 г. 6:02
    Отвечающий
  • Спасибо помогло
    16 августа 2016 г. 8:50
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.

    16 августа 2016 г. 9:21
    Отвечающий