禁用基于VisualState的弹出

时间:2019-07-17 16:27:51

标签: c# xaml uwp uwp-xaml

我尝试根据MenuFlyout添加/删除VisualStateManager

我有两个状态TouchNoTouch。我想在名为rowGrid的网格上设置弹出窗口。我尝试了不同版本的VisualStates。 例如:

<VisualStateGroup x:Name="TouchGroup">
    <VisualState x:Name="Touch">
        <VisualState.Setters>
            <Setter Target="rowGrid.ContextFlyout">
                <Setter.Value>
                    <MenuFlyout >
                        <MenuFlyoutItem Text="Play" />
                    </MenuFlyout>
                </Setter.Value>
            </Setter>
        </VisualState.Setters>
    </VisualState>
    <VisualState x:Name="NoTouch">
        <VisualState.Setters>
            <Setter Target="rowGrid.ContextFlyout" Value="{x:Null}" />
        </VisualState.Setters>
    </VisualState>
</VisualStateGroup>

但是,一旦使用NoTouch方法激活了StateManager.GoToState(...)状态,这将引发COMException(E_FAIL)。另一个状态将设置“弹出”,但没有任何内容可以提供空菜单。

网格本身位于DataTemplate的{​​{1}}内

我想念什么?

1 个答案:

答案 0 :(得分:0)

  

基于VisualState禁用弹出按钮

Flyout是延迟加载控制,无法使用VisualState进行初始化,需要在xaml中的以前进行初始化。如果要基于VisualState禁用Flyout,则可以更改MenuFlyoutPresenter样式以隐藏Flyout,有关详细信息,请参考以下代码。

<Grid Background="Transparent" x:Name="rowGrid" >
    <Grid.ContextFlyout >
        <MenuFlyout x:Name="GridMenuFlyout" >
            <MenuFlyoutItem Text="Reset"/>
            <MenuFlyoutSeparator/>
            <ToggleMenuFlyoutItem Text="Repeat"/>
            <ToggleMenuFlyoutItem Text="Shuffle"/>
        </MenuFlyout>
    </Grid.ContextFlyout>

    <Grid.Resources>

        <Style TargetType="MenuFlyoutPresenter" x:Key="MenuFlyoutPresenterShowItem">
            <Setter Property="Visibility" Value="Visible"/>
        </Style>
        <Style TargetType="MenuFlyoutPresenter" x:Key="MenuFlyoutPresenterHideItem">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>

    </Grid.Resources>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="TouchGroup">
            <VisualState x:Name="Touch">
                <VisualState.Setters>
                    <Setter Target="GridMenuFlyout.MenuFlyoutPresenterStyle" Value="{ThemeResource MenuFlyoutPresenterShowItem}"/>
                </VisualState.Setters>
            </VisualState>

            <VisualState x:Name="NoTouch">
                <VisualState.Setters>
                    <Setter Target="GridMenuFlyout.MenuFlyoutPresenterStyle" Value="{ThemeResource MenuFlyoutPresenterHideItem}"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
</Grid>