带有自定义图像的 UWP 命令栏 [英] UWP Command Bar with Custom Image

查看:21
本文介绍了带有自定义图像的 UWP 命令栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 UWP 应用开发的新手.我想在我的应用程序主页下方添加一个带有自定义图标的命令栏.谁能建议我如何做到这一点.我想在命令栏中添加的图像如下:

I am new in UWP app development. I would like to add a command bar with custom icon bellow my app main page. Can anyone suggest me how to do this. The image which I would like to add in my command bar is below:

推荐答案

BitmapIcon 允许您创建图像 AppBarButton 图标.用法如下:

BitmapIcon allows you to create image AppBarButton icon. The usage is following:

<CommandBar>
    <AppBarButton Label="Command">
        <AppBarButton.Icon>
            <BitmapIcon UriSource="/Assets/image.png" />
        </AppBarButton.Icon>
    </AppBarButton>
</CommandBar>

然而,问题是,图像的颜色会根据主题更改为默认的系统应用栏图标颜色:

The catch is however, that the image's color will change according to the theme to default system app bar icon color:

如果要添加颜色,需要将BitmapIconForeground属性设置为请求的颜色:

If you want to add colors, you need to set the Foreground property of the BitmapIcon to the requested color:

<AppBarButton Label="Command">
    <AppBarButton.Icon>
        <BitmapIcon Foreground="DarkOrange" UriSource="/Assets/image.png" />
    </AppBarButton.Icon>
</AppBarButton>

以下给出了您要求的布局:

Following gives the layout you requested:

<CommandBar>
    <AppBarButton Label="Command">
        <AppBarButton.Icon>
            <BitmapIcon Foreground="DarkOrange" UriSource="/Assets/image.png" />
        </AppBarButton.Icon>
    </AppBarButton>
    <AppBarButton Label="Command">
        <AppBarButton.Icon>
            <BitmapIcon Foreground="SteelBlue" UriSource="/Assets/image.png" />
        </AppBarButton.Icon>
    </AppBarButton>
    <AppBarButton Label="Command">
        <AppBarButton.Icon>
            <BitmapIcon Foreground="DimGray" UriSource="/Assets/image.png" />
        </AppBarButton.Icon>
    </AppBarButton>
</CommandBar>

最后,如果您的图标有多种颜色,而 BitmapIcon 只有一种颜色这一事实不适合您怎么办?

Finally, what if your icon has multiple colors and the fact that BitmapIcon is one color only does not suit you?

为此,您必须使用 Content 属性,然后修改创建自定义样式以使用 Content 而不是 Icon:

For this you will have to use the Content property and then modify create a custom style to use Content instead of Icon:

<AppBarButton Style="{StaticResource ImageAppBarButtonStyle}" Label="Command">
    <AppBarButton.Content>
        <Image Source="/Assets/appbaricon.png" />
    </AppBarButton.Content>
</AppBarButton>

然后我复制了默认样式(在 Visual Studio 中打开 Document Outline 窗口,右键单击 AppBarButton,选择 Edit template 然后 Edit copy.将 ContentPresenter 中的 TemplateBindingIcon 更改为 所需的唯一更改>内容:

Then I have made a copy of the default style (opened Document Outline window in Visual Studio, right-clicked the AppBarButton, chose Edit template and then Edit copy. The only change required to change the TemplateBinding in ContentPresenter from Icon to Content:

<ContentPresenter x:Name="Content" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" Height="20"/>

完整的样式是:

<Style x:Key="ImageAppBarButtonStyle" TargetType="AppBarButton">
    <Setter Property="Background" Value="{ThemeResource AppBarButtonBackground}"/>
    <Setter Property="Foreground" Value="{ThemeResource AppBarButtonForeground}"/>
    <Setter Property="BorderBrush" Value="{ThemeResource AppBarButtonBorderBrush}"/>
    <Setter Property="HorizontalAlignment" Value="Left"/>
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
    <Setter Property="FontWeight" Value="Normal"/>
    <Setter Property="Width" Value="68"/>
    <Setter Property="UseSystemFocusVisuals" Value="True"/>
    <Setter Property="AllowFocusOnInteraction" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="AppBarButton">
                <Grid x:Name="Root" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" MinWidth="{TemplateBinding MinWidth}" MaxWidth="{TemplateBinding MaxWidth}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="ApplicationViewStates">
                            <VisualState x:Name="FullSize"/>
                            <VisualState x:Name="Compact">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="LabelOnRight">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentViewbox" Storyboard.TargetProperty="Margin">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="12,14,0,14"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentRoot" Storyboard.TargetProperty="MinHeight">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource AppBarThemeCompactHeight}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="(Grid.Row)">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="0"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="(Grid.Column)">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="1"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="TextAlignment">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Left"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Margin">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="8,15,12,17"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="LabelCollapsed">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentRoot" Storyboard.TargetProperty="MinHeight">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource AppBarThemeCompactHeight}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Overflow">
                                <VisualState.Setters>
                                    <Setter Target="ContentRoot.MinHeight" Value="0"/>
                                    <Setter Target="ContentViewbox.Visibility" Value="Collapsed"/>
                                    <Setter Target="TextLabel.Visibility" Value="Collapsed"/>
                                    <Setter Target="OverflowTextLabel.Visibility" Value="Visible"/>
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="OverflowWithToggleButtons">
                                <VisualState.Setters>
                                    <Setter Target="ContentRoot.MinHeight" Value="0"/>
                                    <Setter Target="ContentViewbox.Visibility" Value="Collapsed"/>
                                    <Setter Target="TextLabel.Visibility" Value="Collapsed"/>
                                    <Setter Target="OverflowTextLabel.Visibility" Value="Visible"/>
                                    <Setter Target="OverflowTextLabel.Margin" Value="38,0,12,0"/>
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="OverflowWithMenuIcons">
                                <VisualState.Setters>
                                    <Setter Target="ContentRoot.MinHeight" Value="0"/>
                                    <Setter Target="ContentViewbox.HorizontalAlignment" Value="Left"/>
                                    <Setter Target="ContentViewbox.VerticalAlignment" Value="Center"/>
                                    <Setter Target="ContentViewbox.Width" Value="16"/>
                                    <Setter Target="ContentViewbox.Height" Value="16"/>
                                    <Setter Target="ContentViewbox.Margin" Value="12,0,12,0"/>
                                    <Setter Target="TextLabel.Visibility" Value="Collapsed"/>
                                    <Setter Target="OverflowTextLabel.Visibility" Value="Visible"/>
                                    <Setter Target="OverflowTextLabel.Margin" Value="38,0,12,0"/>
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="OverflowWithToggleButtonsAndMenuIcons">
                                <VisualState.Setters>
                                    <Setter Target="ContentRoot.MinHeight" Value="0"/>
                                    <Setter Target="ContentViewbox.HorizontalAlignment" Value="Left"/>
                                    <Setter Target="ContentViewbox.VerticalAlignment" Value="Center"/>
                                    <Setter Target="ContentViewbox.Width" Value="16"/>
                                    <Setter Target="ContentViewbox.Height" Value="16"/>
                                    <Setter Target="ContentViewbox.Margin" Value="38,0,12,0"/>
                                    <Setter Target="TextLabel.Visibility" Value="Collapsed"/>
                                    <Setter Target="OverflowTextLabel.Visibility" Value="Visible"/>
                                    <Setter Target="OverflowTextLabel.Margin" Value="76,0,12,0"/>
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal">
                                <Storyboard>
                                    <PointerUpThemeAnimation Storyboard.TargetName="OverflowTextLabel"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="PointerOver">
                                <VisualState.Setters>
                                    <Setter Target="Root.Background" Value="{ThemeResource AppBarButtonBackgroundPointerOver}"/>
                                    <Setter Target="Root.BorderBrush" Value="{ThemeResource AppBarButtonBorderBrushPointerOver}"/>
                                    <Setter Target="Content.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                    <Setter Target="TextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                    <Setter Target="OverflowTextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                </VisualState.Setters>
                                <Storyboard>
                                    <PointerUpThemeAnimation Storyboard.TargetName="OverflowTextLabel"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Pressed">
                                <VisualState.Setters>
                                    <Setter Target="Root.Background" Value="{ThemeResource AppBarButtonBackgroundPressed}"/>
                                    <Setter Target="Root.BorderBrush" Value="{ThemeResource AppBarButtonBorderBrushPressed}"/>
                                    <Setter Target="Content.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                    <Setter Target="TextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                    <Setter Target="OverflowTextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                </VisualState.Setters>
                                <Storyboard>
                                    <PointerDownThemeAnimation Storyboard.TargetName="OverflowTextLabel"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled">
                                <VisualState.Setters>
                                    <Setter Target="Root.Background" Value="{ThemeResource AppBarButtonBackgroundDisabled}"/>
                                    <Setter Target="Root.BorderBrush" Value="{ThemeResource AppBarButtonBorderBrushDisabled}"/>
                                    <Setter Target="Content.Foreground" Value="{ThemeResource AppBarButtonForegroundDisabled}"/>
                                    <Setter Target="TextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundDisabled}"/>
                                    <Setter Target="OverflowTextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundDisabled}"/>
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="OverflowNormal">
                                <Storyboard>
                                    <PointerUpThemeAnimation Storyboard.TargetName="ContentRoot"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="OverflowPointerOver">
                                <VisualState.Setters>
                                    <Setter Target="Root.Background" Value="{ThemeResource AppBarButtonBackgroundPointerOver}"/>
                                    <Setter Target="Root.BorderBrush" Value="{ThemeResource AppBarButtonBorderBrushPointerOver}"/>
                                    <Setter Target="Content.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                    <Setter Target="TextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                    <Setter Target="OverflowTextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPointerOver}"/>
                                </VisualState.Setters>
                                <Storyboard>
                                    <PointerUpThemeAnimation Storyboard.TargetName="ContentRoot"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="OverflowPressed">
                                <VisualState.Setters>
                                    <Setter Target="Root.Background" Value="{ThemeResource AppBarButtonBackgroundPressed}"/>
                                    <Setter Target="Root.BorderBrush" Value="{ThemeResource AppBarButtonBorderBrushPressed}"/>
                                    <Setter Target="Content.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                    <Setter Target="TextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                    <Setter Target="OverflowTextLabel.Foreground" Value="{ThemeResource AppBarButtonForegroundPressed}"/>
                                </VisualState.Setters>
                                <Storyboard>
                                    <PointerDownThemeAnimation Storyboard.TargetName="ContentRoot"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="InputModeStates">
                            <VisualState x:Name="InputModeDefault"/>
                            <VisualState x:Name="TouchInputMode">
                                <VisualState.Setters>
                                    <Setter Target="OverflowTextLabel.Padding" Value="0,11,0,13"/>
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="GameControllerInputMode">
                                <VisualState.Setters>
                                    <Setter Target="OverflowTextLabel.Padding" Value="0,11,0,13"/>
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid x:Name="ContentRoot" MinHeight="{ThemeResource AppBarThemeMinHeight}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Viewbox x:Name="ContentViewbox" AutomationProperties.AccessibilityView="Raw" HorizontalAlignment="Stretch" Height="20" Margin="0,14,0,4">
                            <ContentPresenter x:Name="Content" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" Height="20"/>
                        </Viewbox>
                        <TextBlock x:Name="TextLabel" AutomationProperties.AccessibilityView="Raw" FontFamily="{TemplateBinding FontFamily}" Foreground="{TemplateBinding Foreground}" FontSize="12" Margin="2,0,2,6" Grid.Row="1" Text="{TemplateBinding Label}" TextWrapping="Wrap" TextAlignment="Center"/>
                        <TextBlock x:Name="OverflowTextLabel" AutomationProperties.AccessibilityView="Raw" FontFamily="{TemplateBinding FontFamily}" Foreground="{TemplateBinding Foreground}" FontSize="15" HorizontalAlignment="Stretch" Margin="12,0,12,0" Padding="0,5,0,7" Text="{TemplateBinding Label}" TextTrimming="Clip" TextWrapping="NoWrap" TextAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"/>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这篇关于带有自定义图像的 UWP 命令栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆