WPF - System.InvalidOperationException 在 ContextMenu.IsOpen

WPF - System.InvalidOperationException on ContextMenu.IsOpen

我遇到了以下异常:

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll

Additional information: Cannot resolve all property references in the property path 'ContextMenu.IsOpen'. Verify that applicable objects support the properties.

我想这个异常是不言自明的,但我不知道如何解决它。

这是我的代码:

XAML

<Button
    x:Name="btnNotifications"
    Height="50px"
    Width="auto"
    Padding="15 0"
    Click="btnNotifications_Click"
    ToolTip="Notifications &amp; Agenda"
    HorizontalAlignment="Right"
    DockPanel.Dock="Right"
    BorderThickness="0">

    <Button.Style>

        <Style TargetType="Button">

            <Style.Triggers>

                <Trigger Property="IsMouseOver" Value="True">

                    <Setter Property="Background" Value="{DynamicResource AccentColorBrush}"/>

                </Trigger>

                <Trigger Property="IsMouseOver" Value="False">

                    <Setter Property="Background" Value="Transparent"/>

                </Trigger>

                <EventTrigger RoutedEvent="Click">

                    <EventTrigger.Actions>

                        <BeginStoryboard>

                            <Storyboard>

                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">

                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>

                                </BooleanAnimationUsingKeyFrames>

                            </Storyboard>

                        </BeginStoryboard>

                    </EventTrigger.Actions>

                </EventTrigger>

            </Style.Triggers>

        </Style>

    </Button.Style>

    <Button.Content>

        <StackPanel
            Orientation="Horizontal">

            <Image
                Source="/Resources/Icons/Notifications.ico"
                Width="25px"
                Height="25px"/>

            <Label
                x:Name="lblNotifications"
                FontFamily="Century Gothic"
                FontSize="25px"
                Foreground="Maroon"
                Visibility="Collapsed"/>

        </StackPanel>

    </Button.Content>

    <Button.ContextMenu>

        <ContextMenu
            x:Name="btnNotificationsMenu">

            <MenuItem 
                x:Name="btnNotificationsNoNew"
                Header="No New Notifications."/>

            <MenuItem 
                x:Name="btnNotificationsSeperator"
                Background="{DynamicResource AccentColorBrush}"
                Height="2px"
                Focusable="False"
                IsHitTestVisible="False"/>

            <MenuItem 
                x:Name="btnNotificationsNoAgenda"
                Header="Your Agenda is Empty."/>

        </ContextMenu>

    </Button.ContextMenu>

</Button>

代码隐藏

public static void NewAppointmentForm()
{
    MainWindow appointment = new MainWindow(new AppointmentForm(true));
    appointment.btnNotificationsMenu.IsOpen = false;
    appointment.ShowDialog();
}

显然将上述代码包装在 try catch 中并在 appointment 上调用 Close() 可以解决问题。但是,它更像是一种解决方法,而不是干净的解决方案。

每当我尝试通过另一个按钮关闭 window 时,就会出现此问题。我尝试在 EventHandler 中使用 Close() 方法关闭 window,也尝试通过 XAML - Command="{Binding CloseCommand}".

作为命令关闭 window

如果有人能阐明这个问题,我将不胜感激。

我可以指出,包含 ContextMenuButton 包裹在直接放在 MainWindow.

中的 Border

如果需要更多详细信息,请尽管询问。谢谢:)

尝试用括号将 属性 括起来:

Storyboard.TargetProperty="(ContextMenu.IsOpen)"

参见PropertyPath XAML Syntax。 XAML 解析器不知道如何解析 属性 因为它可以附加到任何 DependencyObject。

这是 Isaac 典型的愚蠢错误。

基本上,我复制了具有 ContextMenuButton 并粘贴代码以创建两个 ContextMenu-less 按钮。将以下应用到 ContextMenu-less 按钮导致程序崩溃:

<EventTrigger RoutedEvent="Click">

    <EventTrigger.Actions>

        <BeginStoryboard>

            <Storyboard>

                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">

                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>

                </BooleanAnimationUsingKeyFrames>

            </Storyboard>

        </BeginStoryboard>

    </EventTrigger.Actions>

</EventTrigger>