如何在UWP的StackPanel中使用ContextFlyout?

时间:2016-07-28 09:12:59

标签: c# xaml uwp uwp-xaml

在GridView中,我试图在用户右键单击某个项目时显示上下文菜单。

我试过了:

 <GridView.ItemTemplate>
    <DataTemplate>
       <StackPanel Orientation="Vertical" Width="120" Background="LightBlue">
       <StackPanel.ContextFlyout>
             <MenuFlyout>
                  <MenuFlyoutItem Text="Change color" Click="ChangeColorItem_Click" />
             </MenuFlyout>
...

但是StackPanel.ContextFlyout会抛出错误。我缺少什么?

更新

错误是:The attachable property 'ContextFlyout' was not found in type 'StackPanel'

ContextFlyout是UIElement的一个属性,StackPanel是从UIElement派生的。

2 个答案:

答案 0 :(得分:3)

试试这个:

   <DataTemplate>
      <StackPanel Orientation="Vertical" Width="120" Background="LightBlue">
         <FlyoutBase.AttachedFlyout>
            <MenuFlyout>
                <MenuFlyoutItem Text="Change color" Click="ChangeColorItem_Click" />
            </MenuFlyout>
         </FlyoutBase.AttachedFlyout>
      </StackPanel>
   </DataTemplate>

您需要使用一些代码隐藏来手动管理MenuFlyout。

答案 1 :(得分:3)

  

ContextFlyout是UIElement的一个属性,StackPanel是从UIElement派生的。

是的,你是对的,但是从引入的3.0版本10.0.14393.0开始,请注意这个ContextFlyout属性是可用的。您需要检查API合约版本和设备系列版本。

对于API合约版本1.0 / 2.0,正如@Igor Damiani建议的那样,您可以使用FlyoutBase.AttachedFlyout,例如DataContext可以在RightTapped事件中获取StackPanel 1}}:

private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
    FlyoutBase.ShowAttachedFlyout(sender as StackPanel);
    var datacontext = ((FrameworkElement)e.OriginalSource).DataContext;
}

但我注意到您的MenuFlyoutItem可能会换色,您需要的是实际访问StackPanel或此StackPanel内部的UIElements。如果是这样,最好将颜色绑定到实现INotifyPropertyChanged接口的属性。