[UWP]涨姿势UWP源码——UI布局

简介: 原文:[UWP]涨姿势UWP源码——UI布局懒癌晚期兼正月里都是过年,一直拖到今天才继续更新。之前的几篇介绍了数据的来源,属于准备工作。本篇我们正式开始构建涨姿势UWP程序的UI界面。 我们这个Hello World程序比较简单,总共只有一个页面,在PC和Tablet上呈左右分开,左边以列表显示新闻标题及简述,右边则显示新闻正文。
原文: [UWP]涨姿势UWP源码——UI布局

懒癌晚期兼正月里都是过年,一直拖到今天才继续更新。之前的几篇介绍了数据的来源,属于准备工作。本篇我们正式开始构建涨姿势UWP程序的UI界面。

我们这个Hello World程序比较简单,总共只有一个页面,在PCTablet上呈左右分开,左边以列表显示新闻标题及简述,右边则显示新闻正文。

对于这样的一个布局,Grid无疑是最为合适的Panel,大体是以下的结构:

                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition x:Name="columnLeft" Width="4*"></ColumnDefinition>
                        <ColumnDefinition x:Name="columnRight" Width="6*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>

                    <ListView x:Name="listViewItems" Grid.Column="0" SelectedItem="{Binding SelectedItem,Mode=TwoWay}"
                        ItemsSource="{Binding Items}" ItemTemplate="{StaticResource ZzsItemTemplate}" ItemContainerStyle="{StaticResource ZzsItemStyle}" >
                    </ListView>
                    <ProgressBar  Grid.Column="0" IsIndeterminate="True" Visibility="{Binding IsLoading,Converter={StaticResource boolToVisible}}" ></ProgressBar>

                    <ContentControl Grid.Column="1" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" Margin="4,0"
                        ContentTemplate="{StaticResource WebViewTemplate}" Content="{Binding}"></ContentControl>
                </Grid>

仔细观察可以发现,左上角参照UWP APP的风格,设置了一个汉堡包菜单,通过点击这个按钮会弹出部分选项:

弹出部分的效果通常都是通过SplitView控件来实现,SplitViewUWP中是横向划分空间的不二法宝,也可以参考系统自带的“邮件”APP,其中嵌套了多层SplitView来实现递进的渐次布局。

        <SplitView Grid.Row="1" x:Name="splitView" DisplayMode="CompactOverlay" CompactPaneLength="48" IsPaneOpen="{Binding IsOpen}">
            <SplitView.Pane>
                <ListView ItemsSource="{Binding CategoryList}"
                        ItemTemplate="{StaticResource NavigationItemTemplate}" 
                        ItemContainerStyle="{StaticResource NavigationItemStyle}"
                        SelectedItem="{Binding SelectedCategory,Mode=TwoWay}"></ListView>
            </SplitView.Pane>
            <SplitView.Content>
                <Grid>
                <!-- 这里是上面那个主体内容的Grid -->
         </Grid>
            </SplitView.Content>
        </SplitView>

可以看到SplitViewPane里放了一个CategoryListContent就放了主体内容的Grid,在IsPaneOpen属性变化为True时,则展开显示。

到目前为止,尚未涉及顶部的绿色工具栏。这里不得不感慨一下,虽然UWP可以做到在不同尺寸的Windows10设备上运行,但是UI的适配确实是很麻烦的,同时考虑到Windows Phone的占有率,UWP APP不出Phone版就不难理解了。

为了能够适配Phone的竖屏界面,使工具栏的按钮能按比列分配到左右两边,同时不被SplitViewPane遮挡。我在SplitView的外层再包了一层Grid,可以看到作为最外层的Grid,仅有两行。工具栏Height=Auto置于顶部,第二行放置SplitView占据剩余空间。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="columnLeftBar" Width="4*"></ColumnDefinition>
                <ColumnDefinition Width="Auto" ></ColumnDefinition>
                <ColumnDefinition x:Name="columnRightBar" Width="6*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0" Background="{StaticResource SystemControlBackgroundAccentBrush}">
                <Button Content="&#xE700;" FontFamily="{ThemeResource SymbolThemeFontFamily}" 
                        HorizontalAlignment="Left" Background="{StaticResource SystemControlBackgroundAccentBrush}"
                              Width="48" Height="48" Command="{Binding OpenPaneCommand,Mode=OneTime}"></Button>
                <Button x:Name="buttonSync" Content="&#xE117;" FontFamily="{ThemeResource SymbolThemeFontFamily}" 
                        HorizontalAlignment="Right" Background="{StaticResource SystemControlBackgroundAccentBrush}"
                              Width="48" Height="48" Command="{Binding SyncCommand,Mode=OneTime}"></Button>
            </Grid>
            <Border x:Name="borderMiddle" Grid.Column="1" Background="{StaticResource SystemControlBackgroundAccentBrush}">
                
            </Border>
            <Border Grid.Column="2" Background="{StaticResource SystemControlBackgroundAccentBrush}">
                <Button  Content="&#xE112;" FontFamily="{ThemeResource SymbolThemeFontFamily}" Background="{StaticResource SystemControlBackgroundAccentBrush}"
                            Width="48" Height="48" Command="{Binding GoBackCommand,Mode=OneTime}"></Button>
            </Border>
            
        </Grid>
        <SplitView Grid.Row="1" x:Name="splitView" DisplayMode="CompactOverlay" CompactPaneLength="48" IsPaneOpen="{Binding IsOpen}">
            <!-- SplitView --> 
        </SplitView>
    </Grid>

这里值得一提的是微软提供了大量系统的icon图标,在XAML中,仅需将FontFamily设置成SymbolThemeFontFamily,同时填写编号,即可使用这些非常精致的系统图标。例如:

<Button Content="&#xE700;" FontFamily="{ThemeResource SymbolThemeFontFamily}" 
                        HorizontalAlignment="Left" Background="{StaticResource SystemControlBackgroundAccentBrush}"
                              Width="48" Height="48" Command="{Binding OpenPaneCommand,Mode=OneTime}"></Button>

具体的icon图标可以参考这两篇:

https://docs.microsoft.com/zh-cn/windows/uwp/style/segoe-ui-symbol-font

https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.Symbol

除了icon图标以外,我们同样可以发现一些的系统定义的样式,比如:

<Grid Grid.Column="0" Background="{StaticResource SystemControlBackgroundAccentBrush}">

鼠标放在SystemControlBackgroundAccentBrush上,右键菜单点击转到定义,会打开一个genric.xaml,该文件存在大量的系统配色和样式,非常方便且值得使用。

我们也可以增加一些自定义的Style,例如ListViewItemContainerStyle

<ListView ItemsSource="{Binding CategoryList}"
                        ItemTemplate="{StaticResource NavigationItemTemplate}" 
                        ItemContainerStyle="{StaticResource NavigationItemStyle}"
                        SelectedItem="{Binding SelectedCategory,Mode=TwoWay}"></ListView>

这里的ItemContainerStyle经常需要自定义样式,一般的做法是通过左侧文档大纲,找到ListView节点,然后再选择“编辑其他模板”->“编辑生成的项目容器(ItemContainerStyle)”,通常会在xaml文件的顶部生成<Page.Resources>节点,其中会包含控件本身的Default Style,在此基础上进行修改事半功倍。

如果需要完全重新定义的模板,例如:ItemTemplate="{StaticResource NavigationItemTemplate}"

假设这个NavigationItemTemplate会在多处使用,那可以考虑将该资源定义在App.xaml中供整个程序使用:

    <Application.Resources>
        <ResourceDictionary>
            <local:ViewModelLocator x:Key="Locator" />
            <local:BoolToVisible x:Key="boolToVisible"></local:BoolToVisible>
            <DataTemplate x:Key="NavigationItemTemplate">
                <TextBlock Text="{Binding}" Margin="48,0"></TextBlock>
            </DataTemplate>
        </ResourceDictionary>
    </Application.Resources>

以上就是MainPage.xaml的大概内容分析,下一篇会结合MainPage.xaml.cs的代码来进一步介绍涨姿势UWP的相关内容。

GitHub源代码地址: 

https://github.com/manupstairs/ZhangZiShiRSSRead

Windows Store

https://www.microsoft.com/zh-cn/store/p/%e6%b6%a8%e5%a7%bf%e5%8a%bfuwp/9nblggh3zqd1

目录
相关文章
|
4月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
138 1
|
29天前
|
Android开发 开发者 容器
flutter:&UI布局 (六)
本文档介绍了Flutter中的UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局等。通过具体示例代码展示了如何使用这些布局组件来构建灵活多变的用户界面,例如使用Column垂直排列文本、使用Stack叠加组件、以及利用Wrap实现自动换行的按钮布局等。
|
3月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
54 1
|
3月前
|
搜索推荐 数据库
最新UI六零导航系统源码 | 多模版全开源
使用PHP+MySql,增加后台管理 多模板选择,支持在后台切换模板 增加常用搜索引擎,如:知乎、哔哩哔哩、在线翻译等(支持自定义) 支持用户提交收录申请,地址:http://域名/apply 部分模板优化和增加部分功能,如返回顶部、获取输入框焦点、时间日期显示等
73 1
|
3月前
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
119 0
|
4月前
|
小程序 前端开发
微信综合购物商城小程序ui模板源码
微信电商小程序前端页面,综合购物商城ui界面模板。主要功能包含:电商主页、商品分类、购物车、购物车结算、我的个人中心管理、礼券、签到、新人专享、专栏、商品详情页、我的订单、我的余额、我的积分、我的收藏、我的地址、我的礼券等。这是一款非常齐全的电商小程序前端模板。
95 4
|
4月前
|
小程序 PHP
全新UI自助图文打印系统小程序源码 PHP后端 附教程
全新UI自助图文打印系统小程序源码 PHP后端 附教程
273 2
|
4月前
Element UI 源码改造 —— 自定义数字输入框的实现
Element UI 源码改造 —— 自定义数字输入框的实现
162 1
|
4月前
|
前端开发
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
|
4月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
采用的方法是在修改数据时,通过`this.dArray.splice(index, 1, this.dArray[index])`替换指定元素,强制数组更新并反映到界面上。
179 0