【问题标题】:Disable Flyout based on VisualState禁用基于 VisualState 的 Flyout
【发布时间】:2019-07-18 14:21:52
【问题描述】:

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

我有两个状态 TouchNoTouch。我想在名为 rowGrid 的网格上设置 Flyout。我尝试了不同版本的 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>

然而,一旦使用StateManager.GoToState(...) 方法激活NoTouch 状态,这将引发COMException (E_FAIL)。另一种状态将设置 Flyout,但没有任何内容,仅提供空菜单。

网格本身位于ListViewDataTemplate

我错过了什么?

【问题讨论】:

    标签: c# xaml uwp uwp-xaml


    【解决方案1】:

    禁用基于 VisualState 的 Flyout

    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>
    

    【讨论】:

    • 谢谢。我今晚一回到家就试试。
    • 成功了。但是执行右键单击将禁用所有悬停效果(包括按钮)。我假设它仍然处于上下文菜单模式,但什么也不显示。有什么想法可以防止这种情况发生吗?
    • 请尝试将&lt;Setter Property="IsEnabled" Value="False"/&gt;添加到MenuFlyoutPresenterHideItem样式中。
    • 不幸的是,这没有帮助。它只是禁用 Flyout 及其子项(不再可见)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多