单击ContextMenu而不是使用Button Control点击并按住

时间:2011-09-15 13:18:56

标签: windows-phone-7 silverlight-toolkit

我试图在这个问题上运用同样的想法解释 使用按钮控件{@ 3}}到我的应用程序。

但是,在执行下面的代码时,我得到NullRefrenceException

<Button Content="Menu" Margin="0,0,316,699" Grid.Row="1" x:Name="MenuButton" >
    <toolkit:GestureService.GestureListener>
        <toolkit:GestureListener Tap="GestureListener_Tap" />
    </toolkit:GestureService.GestureListener>
    <toolkit:ContextMenuService.ContextMenu>
        <toolkit:ContextMenu>
            <toolkit:MenuItem Header="Add to Favorite"  Click="AddFavorite_Click"/>
            <toolkit:MenuItem Header="Samples"  Click="Samples_Click"/>
            <toolkit:MenuItem Header="Send to friends"  Click="SendToFriends_Click"/>
            <toolkit:MenuItem Header="Links"  Click="Links_Click"/>
        </toolkit:ContextMenu>
    </toolkit:ContextMenuService.ContextMenu>
</Button>

private void GestureListener_Tap(object sender, Microsoft.Phone.Controls.GestureEventArgs e)
{
    Button button = sender as Button;
    ContextMenu contextMenu = ContextMenuService.GetContextMenu(button);

    if (contextMenu.Parent == null)
    {

        contextMenu.IsOpen = true;
    } 
}

实际上,由于某些原因,仅使用带边框控件的示例代码会给我相同的NullReferenceException。下面是我得到的异常堆栈。

at Microsoft.Phone.Controls.ContextMenu.UpdateVisualStates(Boolean useTransitions)

at Microsoft.Phone.Controls.ContextMenu.OnOpened(RoutedEventArgs e)

at Microsoft.Phone.Controls.ContextMenu.<OpenPopup>b__12(Object s, EventArgs e)

at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, 
Object sender, Object args)

at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

有人可以帮我解决如何使代码工作的问题吗?我是Windows Phone应用程序开发的新手,所以任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:4)

这里也有同样的问题。

该错误是由以下代码引起的:

private void UpdateVisualStates(bool useTransitions) 
[..]
_outerPanel.Orientation = Orientation.Vertical;

此时OnApplyTemplate()尚未被调用,导致_outerPane l为空。

可以通过检查问题是否为null并重新编译工具包来解决问题。

不幸的是,微软拒绝修复problem

...的Stefan

答案 1 :(得分:1)

我建议两件事:

1)silverlight工具包7.1中存在错误,因此在从hold事件中调用上下文菜单时会出现异常。

<Button Content="Menu" Margin="0,0,316,699" Grid.Row="1" x:Name="MenuButton" Hold="MenuButton_Hold"/>

    <toolkit:ContextMenuService.ContextMenu>
        <toolkit:ContextMenu>
            <toolkit:MenuItem Header="Add to Favorite"  Click="AddFavorite_Click"/>
            <toolkit:MenuItem Header="Samples"  Click="Samples_Click"/>
            <toolkit:MenuItem Header="Send to friends"  Click="SendToFriends_Click"/>
            <toolkit:MenuItem Header="Links"  Click="Links_Click"/>
        </toolkit:ContextMenu>
    </toolkit:ContextMenuService.ContextMenu>

C#代码没问题,因为它只是将其复制到hold事件

2)您不必将上下文菜单放入按钮括号中,然后返回7.0 silverlight工具包。

<Button Content="Menu" Margin="0,0,316,699" Grid.Row="1" x:Name="MenuButton" Click="MenuButton_Click"/>

    <toolkit:ContextMenuService.ContextMenu>
        <toolkit:ContextMenu>
            <toolkit:MenuItem Header="Add to Favorite"  Click="AddFavorite_Click"/>
            <toolkit:MenuItem Header="Samples"  Click="Samples_Click"/>
            <toolkit:MenuItem Header="Send to friends"  Click="SendToFriends_Click"/>
            <toolkit:MenuItem Header="Links"  Click="Links_Click"/>
        </toolkit:ContextMenu>
    </toolkit:ContextMenuService.ContextMenu>