简体   繁体   English

NavigationView 和 AutoSuggestbox 不建议 NavigationViewItems UWP

[英]NavigationView and AutoSuggestbox not suggesting NavigationViewItems UWP

I've stuck on the problem with matching phrases with Property value "Content" of NavigationViewItem.我一直坚持使用 NavigationViewItem 的属性值“Content”匹配短语的问题。 My app is pretty large, so I made a sample view for the sake of this post.我的应用程序非常大,所以为了这篇文章,我制作了一个示例视图。

This is my XAML View Code这是我的 XAML 查看代码

<Page
    x:Class="testowa.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:testowa"
    xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:rg="using:SourceChord.ResponsiveGrid"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    muxc:BackdropMaterial.ApplyToRootOrPageBackground="True">

    <Page.Resources>
        <!--This top margin is the height of the custom TitleBar-->
        <Thickness x:Key="NavigationViewContentMargin">0,48,0,0</Thickness>

    </Page.Resources>
    <Grid>
        <Border x:Name="AppTitleBar"
                IsHitTestVisible="True"
                VerticalAlignment="Top"
                Background="Transparent"
                Height="40"
                Canvas.ZIndex="1" 
                Margin="48,8,0,0">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="AppFontIcon"
                    HorizontalAlignment="Left" 
                    VerticalAlignment="Center"
                    Source="Assets/Square44x44Logo.png" 
                    Width="16" 
                    Height="16"/>
                <TextBlock x:Name="AppTitle"
                    Text="Aplikacja Szpitalna"
                    VerticalAlignment="Center"
                    Margin="12, 0, 0, 0"
                    Style="{StaticResource CaptionTextBlockStyle}" />
            </StackPanel>
        </Border>
        <muxc:NavigationView x:Name="NavigationViewControl"
            IsTitleBarAutoPaddingEnabled="False"            
            IsBackButtonVisible="Visible"           
            DisplayModeChanged="NavigationViewControl_DisplayModeChanged"   
            Canvas.ZIndex="0">
            <muxc:NavigationView.Header>
                <Grid HorizontalAlignment="Left" Padding="0" Margin="6,0,0,0">
                    <TextBlock Text="Dashboard" HorizontalAlignment="Center" FontSize="20" />
                </Grid>
            </muxc:NavigationView.Header>
            <muxc:NavigationView.AutoSuggestBox>
                <AutoSuggestBox 
                    PlaceholderText="Wyszukaj" 
                    QueryIcon="Find"                     
                    x:Name="controlsSearchBox"
                    TextChanged="ControlsSearchBox_TextChanged"
                    VerticalAlignment="Center"
                    x:FieldModifier="public"
                    MinWidth="200"
                    KeyboardAcceleratorPlacementMode="Hidden">
                </AutoSuggestBox>
            </muxc:NavigationView.AutoSuggestBox>
            <muxc:NavigationView.MenuItems>
                <muxc:NavigationViewItemSeparator />
                <muxc:NavigationViewItem Icon="Home" Content="Menu Główne"/>
                <muxc:NavigationViewItemSeparator />
                <!--Sekcja techniczna-->
                <muxc:NavigationViewItemHeader Content="Techniczne" Margin="0,20,0,0"/>
                <muxc:NavigationViewItem Icon="List" Content="System Kolejkowy"/>

                <muxc:NavigationViewItem Icon="FourBars" Content="Networking">
                    <muxc:NavigationViewItem.MenuItems>
                        <muxc:NavigationViewItem Content="Serwery" Icon="AllApps"/>
                        <muxc:NavigationViewItem Content="Urządzenia aktywne" Icon="Manage"/>
                        <muxc:NavigationViewItem Content="Punkty PPD" Icon="Map"/>
                        <muxc:NavigationViewItem Content="Adresy IP" Icon="GoToStart"/>
                        <muxc:NavigationViewItem Content="Dostęp zdalny" Icon="Globe"/>
                        <muxc:NavigationViewItem Content="Skaner ARP" Icon="Find"/>
                    </muxc:NavigationViewItem.MenuItems>
                </muxc:NavigationViewItem>
            </muxc:NavigationView.MenuItems>
        </muxc:NavigationView>
    </Grid>
</Page>

This is Event Method binded to AutoSuggestBox这是绑定到 AutoSuggestBox 的事件方法

private void ControlsSearchBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
    // Pobierz tekst z elementu AutoSuggestBox
    string searchText = sender.Text;

    // Filtruj elementy menu nawigacyjnego za pomocą pobranego tekstu
    var filteredMenuItems = NavigationViewControl.MenuItems
        .OfType<NavigationViewItem>()
        .Where(item => item.Content.ToString().ToLowerInvariant().Contains(searchText.ToLowerInvariant()))
        .ToList();

    // Ustaw wynik filtrowania jako elementy sugestii dla elementu AutoSuggestBox
    sender.ItemsSource = filteredMenuItems;
}

Nothing happens, Debug.WriteLine shows 0 elements in filteredMenuItems.没有任何反应,Debug.WriteLine 在 filteredMenuItems 中显示 0 个元素。 I've been looking the solution for days.几天来我一直在寻找解决方案。 Checked Learn.Microsoft, sample Github projects.检查了 Learn.Microsoft,样本 Github 项目。

I'm expecting the code shows NavigationViewItems which match the phrase with Content我期待代码显示 NavigationViewItems 与内容匹配的短语

There are not only NavigationViewItem in the NavigationViewControl.MenuItems , but also NavigationViewItemSeparator and NavigationViewItemHeader in it. NavigationViewItem中不仅有NavigationViewControl.MenuItems ,还有NavigationViewItemSeparatorNavigationViewItemHeader

Please try the following code:请尝试以下代码:

    public List<string> CheckItems( List<object> sourceList, List<string> resultList, string searchText) 
    {
        foreach (var item in sourceList)
        {
            if (item.GetType() == typeof(MUXC.NavigationViewItem))
            {
                // get first level item
                MUXC.NavigationViewItem viewItem = item as MUXC.NavigationViewItem;

                //check if contains second level items

                List<object> level2Items = viewItem.MenuItems.ToList();

                if (level2Items.Count > 0)
                {
                    CheckItems(level2Items,resultList,searchText);
                }
                else
                {
                    // this is the first level item
                    var str = viewItem.Content.ToString().ToLowerInvariant();
                    if (str.Contains(searchText))
                    {
                        resultList.Add(viewItem.Content.ToString());
                    }
                }
            }
        }

        return resultList;
    }

    private void controlsSearchBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
    {
        string searchText = sender.Text;

        List<string> resultList = new List<string>();

        List<object> itemlist = NavigationViewControl.MenuItems.ToList();

        CheckItems(itemlist, resultList, searchText);

        sender.ItemsSource = resultList;
    }

Let me give you another option that switches the Visibility of each item.让我给你另一个选项来切换每个项目的Visibility

private void ControlsSearchBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
    string filter = sender.Text.ToLowerInvariant();

    foreach (object item in this.NavigationViewControl.MenuItems)
    {
        MakeVisibleItemsThatMatchFilter(parent: null, child: item, filter);
    }
}

private void MakeVisibleItemsThatMatchFilter(NavigationViewItem? parent, object child, string filter)
{
    if (child is NavigationViewItem childNavigationViewItem)
    {
        if (childNavigationViewItem.Content is string content &&
            content.ToLowerInvariant().Contains(filter) is true)
        {
            childNavigationViewItem.Visibility = Visibility.Visible;

            if (parent is not null)
            {
                parent.Visibility = Visibility.Visible;
                parent.IsExpanded = true;
            }
        }
        else
        {
            childNavigationViewItem.Visibility = Visibility.Collapsed;
        }

        foreach (object grandChild in childNavigationViewItem.MenuItems)
        {
            MakeVisibleItemsThatMatchFilter(childNavigationViewItem, grandChild, filter);
        }
    }
    else if (child is UIElement childUIElement)
    {
        childUIElement.Visibility = string.IsNullOrEmpty(filter) is true
            ? Visibility.Visible
            : Visibility.Collapsed;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM