65.9K
CodeProject 正在变化。 阅读更多。
Home

编程 Windows 10 桌面:UWP 焦点(第 5 章)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2017 年 11 月 28 日

CPOL

7分钟阅读

viewsIcon

10274

downloadIcon

412

UWP 入门(从 WinForm 迁移) 第 5 章 为多个期刊条目添加选项卡(Pivot)

引言

*NaNoWriMo[^],我可不输给你。 :) 看来我要在一个月内写完《编程 Windows 10》了。

*十一月是全国小说写作月(在一个月内写完你的小说)

本文继续我尝试讲述 UWP(通用 Windows 平台)范例下桌面开发故事的系列文章。

您可以阅读此文之前的其他文章

编程 Windows 10:UWP 焦点 (N 篇中的第 1 篇)[^]

编程 Windows 10:UWP 焦点 (N 篇中的第 2 篇)[^]

编程 Windows 10:UWP 焦点 (N 篇中的第 3 篇)[^]

编程 Windows 10 桌面:UWP 焦点 (N 篇中的第 4 篇)[^]

背景

我们直接从上次的 DailyJournal 应用开始。

从上一篇文章中获取代码,在 Visual Studio 中打开它,然后我们将为 `ListView` 添加更多测试数据。

添加更多测试数据

将以下行添加到 `MainPage.xaml.cs` 文件中的 `Page_Load()` 方法。

           EntriesListView.Items.Add("2 super");

          EntriesListView.Items.Add("2 extra");

           EntriesListView.Items.Add("2 maximum");

           EntriesListView.Items.Add("2 advanced");

           EntriesListView.Items.Add("2 efficient");

 

这将有助于更明显地看出问题。

缺少滚动功能

上次我们离开应用时,最明显的问题之一是 `ListView` 滚动不正常,或者几乎无法滚动。此外,`RichEditBox` 根本不滚动。即使您粘贴了超出屏幕范围的文本,也从未出现过滚动条。

现在您已经进行了上述更改,请继续构建并运行应用程序(`CTRL-F5`)。

 

根据您的初始窗口大小,情况可能会有所不同,但如果您尝试向下滚动 `ListView` 项目,您会发现无法滚动到最后并看到所有项目。

在我的应用中,我只能显示从添加的第二组中的第一个项目(*2 super*)。列表中实际上还有更多项目,但我们无法滚动到它们。

另外请注意,我将多行粘贴到了 `RichEditBox` 中,虽然这些行超出了 `Page` 的范围,但我没有获得任何可用的滚动条。让我们来修复这两个项目,并更多地了解 XAML 和 UWP。

 

星号这,星号那

解决这个滚动问题非常容易,因为我们正确设置了 `Grid`。

在我们的例子中,唯一的问题是我之前在代码中不当设置了第二行的 `height`,因为我给它设置了一个硬编码的值。硬编码的值几乎总是错误的,不是吗?之前我曾将第二行设置为 400 像素高。但是,我们实际上希望第二行(我们的 `ListView` 和 `RichEditBox` 溢出到的地方)相对于它们所在的 `Grid` 元素进行按比例定义。

为此,我们只需将 `Grid RowDefinition height` 设置为星号。

以前的代码是这样的

 

我们只需将 400 更改为 *(星号)。

将那一行更改为

<RowDefinition Height="*"/>

现在它看起来像这样

 

再次构建并运行(`CTRL-F5`),您现在应该能够滚动到 `ListView` 中的最后一个项目。

修复成功!

您还将能够像预期一样使用 `RichEditBox`。您可以键入并继续输入并创建新行,当行超出可视区域大小时,滚动条就会出现。

下载已修复的源代码

您可以从本文顶部下载名为 `DailyJournal_v003.zip` 的 zip 文件,以获取已修复的代码,您可以尝试一下。

以下屏幕截图捕捉了两个滚动条(一个在 `ListView` 中,一个在 `RichEditBox` 中),并显示了 `ListView` 中的最后一项(*2 efficient*)现在可以通过滚动访问。

 

仅更改 XAML 中的一个值和几个字符就取得了如此大的成功。

忘了选项卡控件

我应用中只漏掉了一件事:一个选项卡控件,以便我们每天可以有多个文件条目。

选项卡控件已消失:Pivot 取而代之

哦,玩笑开到我身上了。我刚搜了一下,发现 **UWP 中没有选项卡控件**。糟糕。

我找到了以下帖子,它引导我找到了选项卡控件的替代品,称为 `Pivot`:https://social.msdn.microsoft.com/Forums/windowsapps/en-US/bf1eb831-a049-432d-a86b-ec70f014e6fd/tab-control-in-uwp-application?forum=wpdevelop

有一个非常简单的 `Pivot` XAML 示例,所以我希望我能将 `RichEditBox` 包装在 `Pivot` 中,并添加一些 `PivotItem` 来让它工作起来。

实验

让我们做个实验,看看它可能如何工作。

`Pivot` 看起来相当简单易用。它看起来像另一个容器,所以我们只需要将目标控件(`RichEditBox`)包装在 `Pivot` 中。然后,对于您想显示的每个“选项卡”,只需添加一个 `PivotItem`。

 

这是我添加的 `Pivot` 和 `PivotItem`(包装了 `RichEditBox`)

 

<Pivot x:Name="rootPivot" Title="Pivot Title" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" >

           <PivotItem Header="Entry1">

               <RichEditBox Name="MainRichEdit" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2"

                    HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

           </PivotItem>

       </Pivot>

 

添加之后,我的 `Page` 在设计器中发生了变化,现在看起来是这样的

 

注意 Grid 的行和列

首先要认识到的是,为了让我们的 Pivot 出现在 Grid 元素中的正确位置,我仍然必须为它添加与我们原始 RichEditBox 匹配的属性(`Grid.Column="1" Grid.Row="0" Grid.RowSpan="2"`)。

进行这些更改后,您可以看到它将我们的 RichEditBox 嵌套在 Pivot 中(显示为 Pivot Title)以及 PivotItem(显示为 Entry1)。

删除 Pivot Title?

我猜测(并希望)如果我删除 `Title=”Pivot Title”`,那么那个额外的标题就会消失。我们的目的不需要它,它只是占用了额外的空间。

让我们删除那个属性,看看会发生什么。

成功!您可以看到现在只显示了 PivotIem 的标题,这正是我们需要的。

 

这还不错。我们似乎走在正确的轨道上。

但是,为了获得一个好的示例,我们需要添加另一个 `PivotItem`,它包含一个单独的 `RichEditBox`,以便创建一个示例,与我们拥有同一天多个文件可用性的最终结果相匹配。让我们看看能否添加另一个包含另一个 `RichEditBox` 的 `PivotItem`。

 

复制/粘贴当前 PivotItem

我将简单地复制当前的 PivotItem 并将其粘贴到已有的 PivotItem 下方。之后,我将把 PivotItem 的标题更改为“Entry2”。

Visual Studio 提供了线索

当我这样做时,Visual Studio 会抱怨我,但确实给了我一个关于问题所在的好线索。

 

注意,新的 PivotItem 在设计视图中也没有渲染。Visual Studio 和设计视图无法确定该怎么做,因此它会发出警告。

我们测试的简单解决方案是简单地将名称从 MainRichEdit 更改为 MainRichEdit2。

当我这样做时,一切都很好,我们得到了一个很好的例子。

 

现在您可以看到两个 PivotItems(选项卡)。让我们运行它,确保所有滚动条仍然正常工作,并测试每个 RichEditBox 是否允许我们输入不同的文本。

下载代码:DailyJournal_v004.zip

您可以从本文顶部下载 `DailyJournal_v004.zip` 以获取源代码并尝试一下。

根据我的测试,一切都很好。为了避免在这篇文章中用更多图像让您发疯,我只向您展示这一张截图,它显示了我在*Entry 2* `RichEditBox` 中有文本,并且 `RichEditBox` 和 `ListView` 的滚动条仍然正常工作。

 

我认为这是又一次巨大的成功。特别是考虑到我忘记了选项卡功能,并且能够在事后添加它。

我们的应用程序真正需要做什么

当然,这并不完全是我们应用所需要的。我们不知道确切有多少 PivotItems,因为每个 PivotItem 及其关联的 RichEditBox 将代表一个日记条目。

我们需要能够动态添加 `PivotItems`(以及关联的 `RichEditBoxes`),当应用程序在文件系统中找到日记条目时。

下一篇文章将有更多工作

这需要一些工作,因为我需要解释在磁盘上保存日记条目文件的方案。我会考虑如何清楚地解释它,下次我们将从让我们的 RichEditBox 保存其数据开始。

历史

2017-11-28:文章首次发布

© . All rights reserved.