【问题标题】:Customize NavigationView panel to include image UWP自定义 NavigationView 面板以包含图像 UWP
【发布时间】:2018-07-20 16:21:10
【问题描述】:

我正在尝试在 UWP C# XAML 上自定义 NavigationView,使其在左侧面板的顶部具有静态应用图像,该图像不会重定向到页面,而只是应用图标。

官方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}">

我想对其进行自定义,使其顶部至少有 100x100 像素的图像。

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

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

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

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

预期


是否仍然可以使用NavigationView 来实现这一点,或者我是否需要使用其他 UI 元素,例如 SplitViewMasterDetailView

【问题讨论】:

    标签: c# xaml uwp uwp-xaml


    【解决方案1】:

    问题是由于 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>
    

    我为“LayoutRoot”网格设置了Height="{TemplateBinding Height}",然后您可以将此样式应用于您的 NavigationViewItem,如下所示:

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

    【讨论】:

    • 对不起,没有检查。这可以按要求工作,非常感谢。虽然我只想为此图像禁用OnItemInvoked(NavigationViewItemInvokedEventArgs args)。获取System.InvalidCastException: 'Unable to cast object of type 'Windows.UI.Xaml.Controls.Image' to type 'System.String'.'
    【解决方案2】:

    它对我有用。示例:
    &lt;NavigationViewItemHeader&gt; 写入&lt;NavigationView.MenuItems&gt;。喜欢

    <NavigationView.MenuItems>
        <NavigationViewItemHeader Height="180">
            <Image Source="/Assets/Cubes/purple.png" Width="320" Height="180"/>
        </NavigationViewItemHeader>
    </NavigationView.MenuItems>
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2023-04-06
      相关资源
      最近更新 更多