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

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

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

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

对于这样的一个布局,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控件来实现,SplitView在UWP中是横向划分空间的不二法宝,也可以参考系统自带的“邮件”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>

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

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

为了能够适配Phone的竖屏界面,使工具栏的按钮能按比列分配到左右两边,同时不被SplitView的Pane遮挡。我在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="" FontFamily="{ThemeResource SymbolThemeFontFamily}"
                        HorizontalAlignment="Left" Background="{StaticResource SystemControlBackgroundAccentBrush}"
                              Width="48" Height="48" Command="{Binding OpenPaneCommand,Mode=OneTime}"></Button>
                <Button x:Name="buttonSync" Content="" 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="" 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="" 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,例如ListView的ItemContainerStyle:

<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

时间: 2024-08-18 04:22:33

[UWP]涨姿势UWP源码——UI布局的相关文章

[UWP]涨姿势UWP源码——适配电脑和手机

原文:[UWP]涨姿势UWP源码--适配电脑和手机 上一篇我们介绍了绘制主界面的MainPage.xaml,本篇则会结合MainPage.xaml.cs来讲一讲如何适配电脑和手机这些不同尺寸的设备. 同时适配电脑和手机存在几个麻烦的地方: 屏幕尺寸差距过大,不太适合以手机为基准,然后在电脑上等比放大. 手机屏幕小,但是分辨率高.比如Lumia 950的2K屏就默认采用400%的比例来显示. 手机一般默认竖屏.电脑会有16:9,3:2各种比例,且默认横屏.导致整体布局需要调整. 其他细节讨论可以看

[UWP]涨姿势UWP源码——RSS feed的获取和解析

原文:[UWP]涨姿势UWP源码--RSS feed的获取和解析 本篇开始具体分析涨姿势UWP这个APP的代码,首先从数据的源头着手,即RSS feed的获取和解析,相关的类为RssReader,所有和数据相关的操作均放在里面. 涨姿势网站提供的RSS feed地址为http://www.zhangzishi.cc/feed,在UWP中想要通过发送http request并从URI接受http response,最简单的方式就是使用HttpClient: public async Task<st

[UWP]涨姿势UWP源码——极简的RSS阅读器

原文:[UWP]涨姿势UWP源码--极简的RSS阅读器 涨姿势UWP,一个开源的RSS阅读器,一个纯粹的项目,一个有道德的APP,一个脱离了低级趣味的作者,一些有益于人民的代码.骚年,还等什么,来涨点姿势吧! 该项目代码可能会引起部分人群的不适,敏感人群请在父母陪同下阅读. 看到第三段的骚年们,我想你们是对这个RSS的阅读器感兴趣了,该项目是一个极为简单的UWP的工程,代码托管在GitHub上,供有兴趣学习UWP APP开发的童鞋们参考.工程主要包括以下几个文件: 工程 文件 备注 ZhangZ

[UWP]涨姿势UWP源码——Unit Test

原文:[UWP]涨姿势UWP源码--Unit Test 之前我们讨论了涨姿势UWP的RSS数据源获取,以及作为文件存储到本地,再将数据转化成Model对象.这部分非UI的内容非常适合添加Unit Test.不涉及UI的话,UT写起来简单高效,很是值得投入一点时间以保证程序的可靠性. UWP的Unit Test创建起来并不复杂,首先在涨姿势UWP解决方案下,创建和ZhangZiShiRssRead工程同级的UT工程:ZhangZiShiRssRead.UTTest. 点击确定之后,会创建新的UT工

[UWP]涨姿势UWP源码——IsolatedStorage

原文:[UWP]涨姿势UWP源码--IsolatedStorage 前一篇涨姿势UWP源码分析从数据源着手,解释了RSS feed的获取和解析,本篇则会就数据源的保存和读取进行举例. 和之前的Windows Runtime一样,UWP采用IsolatedStorage的方式来存储APP的私有数据,这样做到APP之间互不干扰,减少了错误及安全隐患.现在的Application的设计似乎都流行这个做法. UWP中对应用程序数据存储区的访问,通常使用ApplicationData这个类来操作,我们把最

用 androidstudio 阅读android源码的布局文件 为什么没有预览?求大神解惑;

问题描述 用 androidstudio 阅读android源码的布局文件 为什么没有预览?求大神解惑: RT,用eclipse的时候偶尔还能看到点东西,用androidstudio 连预览界面都不出现 解决方案 两种原因一种是布局有错误 二是没有选对SDK 解决方案二: 不出现就是因为布局输出错误或者导入自定义布局,不执行代码,就不显示自定义布局内容

微软支持虚幻4引擎,发布引擎 UWP 分支源码

虚幻4引擎已经是许多游戏开发者首选的游戏开发工具了,不管是在主机或PC游戏,虚幻4引擎都能够胜任且被开发者信赖.现在微软宣布了对虚幻4引擎提供UWP通用平台支持,微软还在GitHub上以Epic Games虚幻4引擎的分支名义发表了UWP分支源码. 虚幻4引擎 UWP分支版可由此进入,但需要先加入Epic开发计划和拥有Epic GitHub Org用户.该项目采用社区支持形式,微软Xbox Advanced Technology Group(ATG,先进技术组)将为之提供周期更新,并帮助加速UW

从Chrome源码看浏览器如何layout布局

假设有以下html/css: <div style="border:1px solid #000; width:50%; height: 100px; margin: 0 auto"></div> 这在浏览器上面将显示一个框: 为了画出这个框,首先要知道从哪里开始画.画多大,其次是边缘stroke的颜色,就可以把它画出来了: void draw(SkCanvas* canvas) { SkPaint paint; paint.setStrokeWidth(1);

Android布局优化之ViewStub、include、merge使用与源码分析

http://blog.csdn.net/bboyfeiyu/article/details/45869393 在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性.复杂度也会随之增长.Android官方给了几个优化的方法,但是网络上的资料基本上都是对官方资料的翻译,这些资料都特别的简单,经常会出现问题而不知其所以然.这篇文章就是对这些问题的更详细的说明,也欢迎大家多留言交流. 一.include 首先用得最多的应该是include,按照官方的意思,include就是为了解决重复