首页 > 解决方案 > 使用 Visual States 切换 AppBarButton 可见性时出现“未检测到已安装的组件”错误

问题描述

在我的 UWP 应用程序中,我有一个带有几个 AppBarButtons 的 CommandBar,我正在使用 Visual State 切换其可见性。每当我将任何视觉状态应用为VisualStateManager.GoToState(this, nameof(State1), false);

我收到以下错误:

未检测到已安装的组件。无法为 Setter 解析名称为“Button8”的目标对象。

按钮 (button8) 不为空。

XAML:

        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <CommandBar x:Name="ActionsCommandBar"
                    最大宽度=“640”
                    水平对齐 =“左”
                    背景="透明"
                    ClosedDisplayMode="紧凑"
                    DefaultLabelPosition="右"
                    IsDynamicOverflowEnabled="真"
                    溢出按钮可见性 =“自动”
                    Style="{StaticResource CommandBarWithoutRevealStyle}">
            <CommandBar.PrimaryCommands>
                <AppBarButton x:Name="Button1" Label="Button 1" />
                <AppBarButton x:Name="Button2" Label="Button 2" />
                <AppBarButton x:Name="Button3" Label="Button 3" />
                <AppBarButton x:Name="Button4" Label="Button 4" />
                <AppBarButton x:Name="Button5" Label="Button 5" />
                <AppBarButton x:Name="Button6" Label="Button 6" />
                <AppBarButton x:Name="Button7" Label="Button 7" />
                <AppBarButton x:Name="Button8" Label="Button 8" />
                <AppBarButton x:Name="Button9" Label="Button 9" />
            </CommandBar.PrimaryCommands>
        </命令栏>
        <StackPanel Grid.Row="1" Orientation="Vertical" Margin="20">
            <Button Content="Visual State 1" Click="Button_Click"/>
            <Button Content="Visual State 2" Click="Button_Click1"/>
        </堆栈面板>

        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="FolderStates">
                <VisualState x:Name="State1" >
                    <VisualState.Setters>
                        <Setter Target="Button1.Visibility" Value="Visible" />
                        <Setter Target="Button2.Visibility" Value="Visible" />
                        <Setter Target="Button7.Visibility" Value="Visible" />
                        <Setter Target="Button8.Visibility" Value="Visible" />
                        <Setter Target="Button9.Visibility" Value="Visible" />
                        <Setter Target="Button4.Visibility" Value="Visible" />
                    </VisualState.Setters>
                </视觉状态>
                <VisualState x:Name="State2">
                    <VisualState.Setters>
                        <Setter Target="Button1.Visibility" Value="Visible" />
                        <Setter Target="Button2.Visibility" Value="Collapsed" />
                        <Setter Target="Button7.Visibility" Value="Collapsed" />
                        <Setter Target="Button8.Visibility" Value="Collapsed" />
                        <Setter Target="Button9.Visibility" Value="Collapsed" />
                        <Setter Target="Button4.Visibility" Value="Collapsed" />
                    </VisualState.Setters>
                </视觉状态>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </网格>

C# :

 private void Button_Click(object sender, RoutedEventArgs e)
 {
    try
    {
        VisualStateManager.GoToState(this, nameof(State1), false);
    }
    catch (Exception ex)
    {
        //No installed components were detected exception here 
    }
 }

 private void Button_Click1(object sender, RoutedEventArgs e)
 {
    try
    {
        VisualStateManager.GoToState(this, nameof(State2), false);
    }
    catch (Exception ex)
    {
        //No installed components were detected exception here 
    }
 }

标签: c#xamluwpvisualstatemanagercommandbar

解决方案


我从另一个来源得到了答案。这是因为在页面渲染的时候,Button8实际上是在OverflowFlyout中。这意味着 Button8 未添加到可视化树中。(可以在Debug模式下打开实时可视化树来确认)。

VisualState 的切换是基于当前的可视化树。如果元素没有渲染,VisualState 在切换时会遇到错误。

所以我决定在后面的代码中处理它。


推荐阅读