用UWP实现一个和win10设置页面类似的布局

原文:用UWP实现一个和win10设置页面类似的布局

不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图:

 

是不是有点cool呢,这篇文章,我们就来做一个类似的布局。

首先将我们需要展示出来的东西都添加到页面上,页面如下:

 1     <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 2         <Grid.RowDefinitions>
 3             <RowDefinition Height="30"></RowDefinition>
 4             <RowDefinition Height="*"></RowDefinition>
 5         </Grid.RowDefinitions>
 6
 7         <!--大标题,后退按钮-->
 8         <StackPanel Grid.Row="0" Orientation="Horizontal" x:Name="fullPanel">
 9             <Button Content="Back" x:Name="full_back" Click="full_back_Click"></Button>
10             <TextBlock Margin="10, 0, 0, 0">这是一个大标题</TextBlock>
11         </StackPanel>
12
13
14         <!--副标题,后退按钮,只在desktop上宽度小于500时显示-->
15         <StackPanel Grid.Row="0" Orientation="Horizontal" x:Name="detailPanel" >
16             <Button x:Name="detail_back" Content="Back" Click="detail_back_Click"></Button>
17             <TextBlock Margin="10, 0, 0, 0">这是一个副标题</TextBlock>
18         </StackPanel>
19
20         <!--内容-->
21         <RelativePanel Grid.Row="1">
22             <!--左半部分的list-->
23             <ListView x:Name="left" IsItemClickEnabled="True" ItemClick="left_ItemClick" SelectedIndex="-1">
24                 <ListView.ItemTemplate>
25                     <DataTemplate>
26                         <StackPanel Margin="10">
27                             <TextBlock>
28                                 <Run Text="Item: "></Run>
29                                 <Run Text="{Binding}"></Run>
30                             </TextBlock>
31                         </StackPanel>
32                     </DataTemplate>
33                 </ListView.ItemTemplate>
34             </ListView>
35
36             <!--右半部份的详细信息-->
37             <Grid x:Name="right" >
38                 <StackPanel>
39                     <TextBlock>队长,别开枪。。</TextBlock>
40                     <TextBlock  >
41                         <Run Text="Item:"></Run>
42                         <Run Text="{Binding SelectedItem, ElementName=left}" Foreground="Red"></Run>
43                     </TextBlock>
44                 </StackPanel>
45             </Grid>
46         </RelativePanel>
47     </Grid>

后台绑定测试数据:

1         private void MainPage_Loaded(object sender, RoutedEventArgs e)
2         {
3             this.left.ItemsSource = Enumerable.Range(1, 10).ToList();
4         }

运行起来看看效果,有点乱啊,不急,我们慢慢调。

这个页面中,我们准备在窗口宽度小于500时显示窄布局,大于500时显示宽布局,下面就是我们的VisualState发挥作用的时候了。我们先创建一个VisualStateGroup,只用来针对窗口大小来调整布局,暂时先忽略掉mobile,详细说明请看注释。

 1         <VisualStateManager.VisualStateGroups>
 2             <!--这个group里的VisualState只针对窗口宽度调整布局,不涉及设备-->
 3             <VisualStateGroup x:Name="windowSize">
 4                 <!--宽屏设置-->
 5                 <VisualState x:Name="wide">
 6                     <VisualState.StateTriggers>
 7                         <!--大于等于501就算宽屏了。。-->
 8                         <AdaptiveTrigger MinWindowWidth="501"></AdaptiveTrigger>
 9                     </VisualState.StateTriggers>
10                     <VisualState.Setters>
11                         <!--这里进行宽屏下的设置-->
12                         <!--隐藏副标题-->
13                         <Setter Target="detailPanel.Visibility" Value="Collapsed"></Setter>
14
15                         <!--显示大标题,虽然大标题默认是显示的,但是因为我们以后会通过code修改显示属性,所以这里要重置才行-->
16                         <Setter Target="fullPanel.Visibility" Value="Visible"></Setter>
17
18                         <!--显示右侧内容-->
19                         <Setter Target="right.Visibility" Value="Visible"></Setter>
20
21                         <!--宽屏时,右侧内容应该是在list的右侧-->
22                         <Setter Target="right.(RelativePanel.RightOf)" Value="left"></Setter>
23
24                         <!--显示左侧内容-->
25                         <Setter Target="left.Visibility" Value="Visible"></Setter>
26                     </VisualState.Setters>
27                 </VisualState>
28
29                 <!--窄屏设置-->
30                 <VisualState x:Name="narrow">
31                     <VisualState.StateTriggers>
32                         <!--0-500都是小窗口-->
33                         <AdaptiveTrigger MinWindowWidth="0"></AdaptiveTrigger>
34
35                     </VisualState.StateTriggers>
36                     <VisualState.Setters>
37                         <!--默认显示副标题-->
38                         <Setter Target="detailPanel.Visibility" Value="Visible"></Setter>
39
40                         <!--隐藏大标题,点击副标题的后退才显示-->
41                         <Setter Target="fullPanel.Visibility" Value="Collapsed"></Setter>
42
43                         <!--显示右侧内容,点击副标题后退之后隐藏-->
44                         <Setter Target="right.Visibility" Value="Visible"></Setter>
45
46                         <!--隐藏左侧内容-->
47                         <Setter Target="left.Visibility" Value="Collapsed"></Setter>
48                     </VisualState.Setters>
49                 </VisualState>
50             </VisualStateGroup>
51         </VisualStateManager.VisualStateGroups>

运行起来看看是不是效果要好很多了呢,现在调整窗口的宽度,是不是有点意思了呢?

但是后退按钮还是没有效果,这里我们需要使用code去控制了,但是这个很简单,因为我们在不同的布局下,使用的是不同的button,这样的好处是不需要用code去判断窗口状态。这里我们只贴上后台代码,同样很简单。

 1         private void full_back_Click(object sender, RoutedEventArgs e)
 2         {
 3             // 对于我们的页面来说,full_back按钮是应该隐藏的,因为没有上一层页面
 4             // 所以这里我们忽略掉,但是按钮还是留着,你可以自己来做个隐藏的逻辑
 5         }
 6
 7         private void detail_back_Click(object sender, RoutedEventArgs e)
 8         {
 9             // 这里就是为什么我们在VisualState里重新设置属性的原因
10
11             // 显示左侧的list
12             // 隐藏右侧内容
13             this.left.Visibility = Visibility.Visible;
14             this.right.Visibility = Visibility.Collapsed;
15
16             // 隐藏副标题
17             // 显示主标题
18             this.fullPanel.Visibility = Visibility.Visible;
19             this.detailPanel.Visibility = Visibility.Collapsed;
20         }
21
22         private void left_ItemClick(object sender, ItemClickEventArgs e)
23         {
24             // 这里我们需要判断下,是否需要切换隐藏
25             if (this.ActualWidth <= 500)
26             {
27                 // 显示左侧的list
28                 // 隐藏右侧内容
29                 this.left.Visibility = Visibility.Collapsed;
30                 this.right.Visibility = Visibility.Visible;
31
32                 // 隐藏副标题
33                 // 显示主标题
34                 this.fullPanel.Visibility = Visibility.Collapsed;
35                 this.detailPanel.Visibility = Visibility.Visible;
36             }
37         }

到这里的话,我们的这个页面的行为和设置已经有点像了!

到这里我们这个页面的基本功能就算是差不多了,然后来完善下细节(其实还是有个小问题,状态的切换还是和设置有些区别的)。 

1. 窗口宽度大于500的时候,直接给他一个固定的宽度,让list能宽一些。

2.  窗口宽度小于500的时候,把list撑满整个页面。这里我们需要说下RelativePanel的一个特性(应该是特性吧。。),它内部的控件是不会自动拉伸撑满内部空间的,即使你用了HorizontalAlignment/VerticalAlignment,连Grid都不行!!我们需要使用RelativePanel.AlignXXXX这一系列属性,根据需要来拉伸。

在我们的页面中,我们需要在窄屏下上下左右都对齐,来撑满页面。

1                         <!--拉伸左侧list,撑满页面-->
2                         <Setter Target="left.(RelativePanel.AlignRightWithPanel)" Value="True"></Setter>
3                         <Setter Target="left.(RelativePanel.AlignBottomWithPanel)" Value="True"></Setter>
4                         <Setter Target="left.(RelativePanel.AlignLeftWithPanel)" Value="True"></Setter>
5                         <Setter Target="left.(RelativePanel.AlignTopWithPanel)" Value="True"></Setter>

最后的效果!

 

这篇文章的例子只是一个很简单布局,如果你准备实现复杂一些的功能的话,可以考虑把右侧的Grid换成Frame,然后通过左侧的ListItem导航到不同的页面,来显示不同的内容。

时间: 2024-09-17 09:25:33

用UWP实现一个和win10设置页面类似的布局的相关文章

Android设置页面的设计

在Android 的程序中设置项可以说是一个必须要有的页面.下面说一下如何写一个基本的设置页面.我们先来看一下常用安卓程序的设置页面:      都是大同小异,下面说一下如何实现.其实就是layout的组合,关键是如何去设置图中的圆角.因为大家都知道Android默认的方形的,要想实现圆角就需要我们自己来实现了.方法有很多种,一种实现方法就是做一个背景图片,把图片边角改成圆角的.9.png格式的.如下:

UWP入门(四)--设置控件样式

原文:UWP入门(四)--设置控件样式 官方定义:可以使用 XAML 框架通过多种方式自定义应用的外观. 通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 可分享至不同elements的资源中 创建可重用的style,并且这一资源可以分享至整单页面.多页面.整个 app,甚至不同的app? how to keep up with style in different app (pre-build theme) 预建主题 2. 直接看简单的Demo <Page.Res

ASP.NET:设置页面buffer引出来的问题

asp.net|问题|页面 前几天,在程序使用Respoonse.Redirect("a.aspx?f=9#12")的时候,发现在IE里面,跳转之后的页面忽略了#之后的内容,奇怪的是在同一页面向自己Redirect的时候,这个问题就不会存在,百思不得其解,有病乱投医吧,上网狂搜了一把,有人说设置页面Buffer为false可能解决这个问题,于是将a页面的buffer设置了false,经过验证,这个与上述问题不相干,但是一时疏忽,忘记了没有将buffer修改过来,昨天项目发布,放到服务器

Dreamweaver 入门:使用CSS设置页面格式

css|dreamweaver|页面 本文章介绍如何在 Dreamweaver 中使用层叠样式表 (CSS) 设置页面中的文本格式.您可以使用 CSS 以 HTML 无法提供的方式来设置文本格式和定位文本,从而能更加灵活自如地控制页面的外观. 了解 CSS 层叠样式表 (CSS) 是一系列格式设置规则,它们控制 Web 页面内容的外观.使用 CSS 设置页面格式时,内容与表现形式是相互分开的.页面内容(HTML 代码)位于自身的 HTML 文件中,而定义代码表现形式的 CSS 规则位于另一个文件

设置页面链接的有效优化方式

网站页面链接布局一直是站长比较关心的话题之一,而如何做好网站页面布局对很多站长来说也是一件比较烦恼的事情,网站页面链接布局牵涉到网站的各个方面,而笔者经过对很多网站进行分析,发现大多数知名网站采用的页面链接优化形式都是面包屑形式,那么什么是面包屑布局模式呢? 面包屑的表面意思上可以看做是细小划分所占面包中的具体地位,而运用在网站中我们就可以将页面面包屑布局模式看做是网站页面所占网站整体的权重比重,而我们要做的就是合理安排这些权重布局,让整个网站呈现出健康发展的局面. 一.合理布局页面链接所占位置

ASP.NET动态设置页面标题的方法详解

这篇文章介绍了ASP.NET动态设置页面标题的方法详解,有需要的朋友可以参考一下     ASP.NET为我们提供了一个控件类:System.Web.UI.HtmlControls.HtmlGenericControl.它可以实现 HTML的元素的一个实例,比如在.cs代码中控制aspx中的<td>元素(注意,它不是<ASP:TableCell>). 我们知道,页面标题是被包含在<TITLE></TITLE>中的,而<TITLE>也是一个HTML

tplink路由器打不开设置页面怎么办

  tplink路由器打不开设置页面的解决方法 首先要确定你的路由器是否是输入192.168.1.1;因为根据我的经验有的路由器需要输入192.168.1.1,还有的是别的;具体根据路由器的铭牌上标注的为准. 如果输入铭牌后面的路由器地址还是无法打开页面,或者输入账号和密码后仍然无法打开相关页面,那么此时很多人都会去PingIp地址,其实在我看来直接恢复出厂设置90%多的问题都能解决,不用费那个步骤,并且很多人都看不懂,也不知道啥意思.有的路由器是一个小圆孔(有的是一个Reset按键),用针堵进

设置页面效果——Word 2007书籍排版完全手册3

设置页面效果--Word 2007书籍排版完全手册(三) 在Word2007书籍的排版过程中,设置好各种样式之后,首先需要对页面的各种效果进行设置,下面一一介绍. 1. 设置开本大小 设置开本即设置纸张大小,现以排版制作一本开本为A4 规格的书籍为例来说明怎样设置开本的大小. 单击功能区的" 页面布局" ,可以在分类功能区" 页面设置" 中单击" 纸张大小" 功能项右侧的下拉按钮,然后选择" A4 (21×29.7cm )"

word怎么设置页面背景

为word添加一个背景可使word文档看上去更具有乐趣,也能增加它的观赏性,现在让我们一起为word增添一个属于你自己的背景吧! 可以为背景应用渐变.图案.图片.纯色或纹理.渐变.图案.图片和纹理将进行平铺或重复以填充页面.如果将Word文档保存为网页,图片.纹理和渐变将保存为JPEG(JPEG:一种图形文件格式(Microsoft Windows 中的.jpg 扩展名),受到为压缩和存储照片图像而开发的许多 Web 浏览器的支持.最好使用它来处理色彩丰富的图形,如扫描的照片.)文件,图案将保存