代码之家  ›  专栏  ›  技术社区  ›  Morse unmounted

自定义导航视图面板以包含图像UWP

  •  3
  • Morse unmounted  · 技术社区  · 6 年前

    我正在尝试自定义 NavigationView 在UWP C#XAML上,在左面板的顶部有一个静态应用程序图像,它不会重定向到页面,而只是应用程序图标。

    官员 documentation 只提到使用 Canvas.Index 0/1选项和自定义背景。

    <NavigationView OpenPaneLength="200"
                    x:Name="navigationView"
                    SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"
                    Header="{x:Bind ViewModel.Selected.Content, Mode=OneWay}"
                    IsSettingsVisible="True"
                    IsPaneToggleButtonVisible="True"
                    Background="{ThemeResource SystemControlBackgroundAltHighBrush}">
    

    Corresponding Nav panel

    我想定制一个至少100x100像素的图像,在顶部。

    我试过什么?: 我尝试了下面的代码,但图像只占用左边的图标空间。

    <NavigationViewItem>
        <Image Source="/Assets/Cubes/purple.png"
               HorizontalAlignment="Center"></Image>
    </NavigationViewItem>
    

    Image 2

    <NavigationViewItem>
        <Image Source="/Assets/Cubes/purple.png"
               HorizontalAlignment="Center" MinHeight="100" MinWidth="100"></Image>
    </NavigationViewItem>
    

    image 3

    <NavigationViewItem Height="100">
        <Image Source="/Assets/Cubes/purple.png"
               HorizontalAlignment="Center" MinHeight="100" MinWidth="100"></Image>
    </NavigationViewItem>
    

    image 4

    预期

    enter image description here


    是否仍有可能通过 导航视图 或者我需要使用其他ui元素,比如 SplitView MasterDetailView

    1 回复  |  直到 6 年前
        1
  •  1
  •   Xie Steven    6 年前

    此问题是由于根面板的NavigationViewitem的ControlTemplate高度设置为固定值(40)。

    您可以编辑NavigationViewitem的样式以使其满足您的要求。

    请看我的以下样品:

    <Style TargetType="NavigationViewItem" x:Key="test">
            <Setter Property="Foreground" Value="{ThemeResource NavigationViewItemForeground}" />
            <Setter Property="Background" Value="{ThemeResource NavigationViewItemBackground}" />
            <Setter Property="BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrush}" />
            <Setter Property="BorderThickness" Value="{StaticResource NavigationViewItemBorderThickness}" />
            <Setter Property="UseSystemFocusVisuals" Value="True" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="NavigationViewItem">
                        <Grid
                        x:Name="LayoutRoot"
                        Height="{TemplateBinding Height}"
                        Background="{TemplateBinding Background}"
                        Control.IsTemplateFocusTarget="True">
    
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="PointerStates">
                                    <VisualState x:Name="Normal" />
    
                                    <VisualState x:Name="PointerOver">
                                        <VisualState.Setters>
                                            <Setter Target="LayoutRoot.(RevealBrush.State)" Value="PointerOver" />
                                            <Setter Target="LayoutRoot.Background" Value="{ThemeResource NavigationViewItemBackgroundPointerOver}" />
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushPointerOver}" />
                                            <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource NavigationViewItemForegroundPointerOver}" />
                                        </VisualState.Setters>
                                    </VisualState>
    
                                    <VisualState x:Name="Pressed">
                                        <VisualState.Setters>
                                            <Setter Target="LayoutRoot.(RevealBrush.State)" Value="Pressed" />
                                            <Setter Target="LayoutRoot.Background" Value="{ThemeResource NavigationViewItemBackgroundPressed}" />
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushPressed}" />
                                            <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource NavigationViewItemForegroundPressed}" />
                                        </VisualState.Setters>
                                    </VisualState>
    
                                    <VisualState x:Name="Selected">
                                        <VisualState.Setters>
                                            <Setter Target="LayoutRoot.Background" Value="{ThemeResource NavigationViewItemBackgroundSelected}" />
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushSelected}" />
                                            <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource NavigationViewItemForegroundSelected}" />
                                        </VisualState.Setters>
                                    </VisualState>
    
                                    <VisualState x:Name="PointerOverSelected">
                                        <VisualState.Setters>
                                            <Setter Target="LayoutRoot.(RevealBrush.State)" Value="PointerOver" />
                                            <Setter Target="LayoutRoot.Background" Value="{ThemeResource NavigationViewItemBackgroundSelectedPointerOver}" />
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushSelectedPointerOver}" />
                                            <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource NavigationViewItemForegroundSelectedPointerOver}" />
                                        </VisualState.Setters>
                                    </VisualState>
    
                                    <VisualState x:Name="PressedSelected">
                                        <VisualState.Setters>
                                            <Setter Target="LayoutRoot.(RevealBrush.State)" Value="Pressed" />
                                            <Setter Target="LayoutRoot.Background" Value="{ThemeResource NavigationViewItemBackgroundSelectedPressed}" />
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushSelectedPressed}" />
                                            <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource NavigationViewItemForegroundSelectedPressed}" />
                                        </VisualState.Setters>
                                    </VisualState>
                                </VisualStateGroup>
    
                                <VisualStateGroup x:Name="DisabledStates">
                                    <VisualState x:Name="Enabled" />
    
                                    <VisualState x:Name="Disabled">
                                        <VisualState.Setters>
                                            <Setter Target="RevealBorder.BorderBrush" Value="{ThemeResource NavigationViewItemBorderBrushCheckedDisabled}" />
                                            <Setter Target="LayoutRoot.Opacity" Value="{ThemeResource ListViewItemDisabledThemeOpacity}" />
                                        </VisualState.Setters>
                                    </VisualState>
                                </VisualStateGroup>
    
                                <VisualStateGroup x:Name="IconStates">
                                    <VisualState x:Name="IconVisible" />
                                    <VisualState x:Name="IconCollapsed">
                                        <VisualState.Setters>
                                            <Setter Target="IconBox.Visibility" Value="Collapsed" />
                                            <Setter Target="IconColumn.Width" Value="16" />
                                        </VisualState.Setters>
                                    </VisualState>
                                </VisualStateGroup>
    
                            </VisualStateManager.VisualStateGroups>
    
                            <!-- Wrap SelectionIndicator in a grid so that its offset is 0,0 - this enables the offset animation. -->
                            <Grid 
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center">
    
                                <Rectangle
                                x:Name="SelectionIndicator"
                                Width="6"
                                Height="24"
                                Fill="{ThemeResource NavigationViewSelectionIndicatorForeground}"
                                Opacity="0.0"/>
                            </Grid>
    
                            <Border
                            x:Name="RevealBorder"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}" />
    
                            <Grid Height="100" HorizontalAlignment="Left" x:Name="ContentGrid">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition x:Name="IconColumn" Width="48" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
    
                                <Viewbox x:Name="IconBox"
                                Child="{TemplateBinding Icon}"
                                Margin="16,12"/>
    
                                <ContentPresenter x:Name="ContentPresenter"
                                Grid.Column="1"
                                ContentTransitions="{TemplateBinding ContentTransitions}"
                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                Content="{TemplateBinding Content}"
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                Margin="{TemplateBinding Padding}"/>
    
                                <ToolTipService.ToolTip>
                                    <ToolTip x:Name="ToolTip" />
                                </ToolTipService.ToolTip>
                            </Grid>
    
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    我设置 Height="{TemplateBinding Height}" 对于“layoutroot”网格,可以将此样式应用于NavigationViewitem,如下所示:

    <NavigationViewItem Style="{StaticResource test}">
        <Image Source="/Assets/Cubes/purple.png" HorizontalAlignment="Center" MinHeight="100" MinWidth="100"></Image>
    </NavigationViewItem>