Триггер на ContextMenu.IsOpen в XAML - PullRequest
1 голос
/ 22 июня 2010

Вот что я пытаюсь сделать:

<Style x:Key="TreeViewItemStyle">
    <Setter Property="TreeViewItem.ContextMenu" Value="{StaticResource ContextMenu}" />
        <Style.Triggers>
            <Trigger Property="TreeViewItem.ContextMenu.IsOpen" Value="True">
                <Setter Property="TreeViewItem.BitmapEffect">
                    <Setter.Value>
                        <OuterGlowBitmapEffect GlowColor="Yellow" GlowSize="2"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style>
    ...

Но он явно не работает, потому что Property="TreeViewItem.ContextMenu.IsOpen" не распознается. Любые предложения, что мне нужно изменить?

1 Ответ

2 голосов
/ 22 июня 2010

Вы можете привязать к свойству IsOpened контекстного меню, используя DataTrigger:

<DataTrigger Binding="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="Background" Value="Green"/>
</DataTrigger>

К сожалению, поскольку все элементы в TreeView имеют одно и то же ContextMenu, которое выделит их все сразу.Кажется, что нет свойства, позволяющего узнать, какой FrameworkElement открыл ContextMenu.

Вы можете обрабатывать события ContextMenuOpening и ContextMenuClosing в TreeViewItem, поскольку они будут всплывать из элемента управления, который обрабатывал щелчок, и проходить через правый TreeViewItem.Если вы хотите сделать это в XAML, вы можете использовать EventTrigger, чтобы запустить однокадровую анимацию, которая изменяет ваше свойство.Самым чистым вариантом может быть написание присоединенного поведения, которое обрабатывает события ContextMenuOpening и ContextMenuClosing и устанавливает для присоединенного свойства значение true, когда контекстное меню открыто.

...