2017 年 2 月

第 32 卷,第 2 期

本文章是由機器翻譯。

現代化應用程式 - 可搜尋 Twitter 的公用程式

Frank La La

Frank La Vigne在我的專欄上個月,我探討了絕佳通用 Windows 平台 (UWP) 社群的工具組,為社群建置由社群開放原始碼工具組。不過,我大略它可以做什麼。UWP 社群工具組讓建置高度定域機組供電 UWP 應用程式更容易、 更快。在本月的專欄中,我將討論如何建置使用 Twitter 服務和分頁控制項來示範使用的是多麼的 Twitter 搜尋應用程式。

目前,我管理數個 YouTube 頻道標示特定的雜湊標記推文的來源內容。例如,#DCTech 分鐘著重於 DC 區域的啟動和技術場景中發生。我發現反白顯示的內容會根據使用 DCTech 雜湊標記推文。如 #Node.js 分鐘,我用來做相同標示 #Node.js 推文。目前,我很多手動剪下和貼上 Twitter 和 OneNote 之間。它有多好可以搜尋所有關鍵片語我需要全都放在一個視窗,輕鬆地從提取內容推文的 Twitter 的 UWP 應用程式。

設定專案

Visual Studio 中建立新的空白 UWP 專案,從 [檔案] 功能表選擇新的專案。依序展開 [已安裝的範本 |Windows |空白的應用程式 (Windows 通用)。將專案命名為 TagSearcherUWP,然後按一下 [確定]。立即之後,會出現對話方塊,詢問您的應用程式應將目標設的 Windows 版本。至少,您必須選擇 Windows 10 週年紀念日等版本 (10.0;建置 14393)。這是最新版本。因此,目標版本和最小版本將同時做為目標相同的版本中所示**[圖 1**。如果您沒有看到這個任一個下拉式清單中的特定版本,請確定您有適當的軟體安裝在您的系統上。Microsoft.Toolkit.Uwp.UI.Controls NuGet 封裝加入專案後,無法選取正確的版本將會產生執行階段錯誤。 

以正確的 Windows 版本為目標
[圖 1 Windows 正確版為目標

方案載入後,瀏覽至 [方案總管] 中,然後參考上按一下滑鼠右鍵並選擇 [管理 NuGet 封裝,從內容功能表,以顯示 [NuGet 封裝管理員。在 [搜尋] 方塊中,輸入 「 Microsoft.Toolkit.Uwp 」,以帶出 UWP 社群工具組相關聯的所有 NuGet 封裝。此專案將使用的 Microsoft.Toolkit.Uwp.Services 和 Microsoft.Toolkit.Uwp.UI.Controls 套件。安裝這兩個以將它們加入至專案。如果出現提示時檢閱的變更] 對話方塊,請檢閱所做的變更,然後按一下 [確定] 以接受。您也會看到每個套件接受授權] 對話方塊。按一下 [我接受] 以接受授權條款。按一下 [我拒絕],將會取消安裝。

Twitter 設定

專案設定適當的 NuGet 封裝,它 ' 將應用程式連接到 Twitter 服務的時間。移至apps.twitter.com並以您的 Twitter 帳戶登入。如果您沒有 Twitter 帳戶,您應該現在要其中一個。如果您尚未建立 Twitter 應用程式,您必須按一下 [建立新的應用程式註冊新的應用程式。

您必須填妥應用程式,例如名稱、 描述、 網站和回呼 URL 的相關詳細資料。您可以填寫欄位,如您所願。做為名稱,我選擇 MSDNTagSearchUWPApp。使用者將會看到的描述文字登入,因此最好能夠簡短和描述性。請參閱**[圖 2**指導方針。針對網站和回呼欄位,我將放在我的網站 URL。若是 UWP 應用程式中,回呼 URL 不一定要使用 URL。當您稍後它登入服務時,請記下 URL。檢查開發人員合約旁邊的核取方塊,然後按一下 [建立您的 Twitter 應用程式] 按鈕。

建立新的 Twitter 應用程式
[圖 2 建立新的 Twitter 應用程式

應用程式建立之後,按一下 [金鑰和存取權杖] 索引標籤上,並記下的取用者金鑰 (API) 和消費者密鑰 (API 密鑰) 欄位中所示**[圖 3**。您將短時間內使用它們。

消費者金鑰和存取權杖] 索引標籤
[圖 3] 索引標籤消費者金鑰和存取權杖

建立 UI

開啟 MainPage.xaml 檔案,並加入 XAML 中的**[圖 4**。請注意,UWP 社群工具組中的控制項加入命名空間。這是 BladeView 控制項所在的位置︰

[圖 4 XAML 程式碼,來建立的介面

<Page
  x:Class="TagSearcherUWP.MainPage"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:TagSearcherUWP"
  xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
  xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d">
  <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
      <RowDefinition Height="56*"/>
      <RowDefinition Height="35*"/>
      <RowDefinition Height="549*"/>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
      <TextBlock FontSize="24" Margin="5">Twitter Tag Searcher</TextBlock>
      <Button Name="btnLogin" Click="btnLogin_Click" >Log In</Button>
    </StackPanel>
    <StackPanel Name="splSearch" Grid.Row="1"  Orientation="Horizontal"
      VerticalAlignment="Center" Visibility="Collapsed">
      <TextBox Name="txtSearch" Margin="5,0,5,0"  MinWidth="140" Width="156" />
      <Button Name="btnSearch" Click="btnSearch_Click">Search</Button>
    </StackPanel>
    <controls:BladeView Name="bladeView" Grid.Row="2" Margin="12"
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
      <controls:BladeItem x:Name="DummyBlade" IsOpen="False" />
    </controls:BladeView>
  </Grid>
</Page

簡介 BladeView 控制項

BladeView 控制項看起來很熟悉 Azure 入口網站的使用者 (portal.azure.com)。如果您已經熟悉它,BladeView 控制項提供容器主機 「 分頁 」 或磚。中的 XAML [圖 4包含 「 DummyBlade 」,防止 XAML 設計工具檢視當機。如果遇到不含任何 BladeItems BladeView,它會擲回例外狀況。因為 IsOpen 屬性設定為 False,使用者永遠不會看到 BladeItem。

登入 Twitter

接下來,應用程式連接到 Twitter API 加 btnLogin_Click 事件的下列事件處理常式︰

private async void btnLogin_Click(object sender, RoutedEventArgs e)
  {
    string apiKey = "pkfAUvqfMAGr53D4huKOzDYDP";
    string apiSecret =
      "bgJCH9ESj1wraCoHBI5OqEqhkac1AOZxujqvnCWKNRJgBMhyPG";
    string callbackUrl = "http://www.franksworld.com";
    TwitterService.Instance.Initialize(apiKey, apiSecret, callbackUrl);
    if (await TwitterService.Instance.LoginAsync())
    {
      splSearch.Visibility = Visibility.Visible;
    }
  }

程式碼會使用 API 金鑰、 API 密碼和回呼 URL 的欄位,並使用它們在 TwitterService.Instance 的 Initialize 方法的參數。TwitterService.Instance 是一個 singleton,將維護整個應用程式的狀態。呼叫 LoginAsync 方法起始 Twitter API 的呼叫。如果登入成功,則方法會傳回 true。在此情況下,您應該要使用搜尋控制項的 StackPanel 可見。

顯示搜尋結果

設定的 Twitter API 呼叫,就建立一個位置以顯示搜尋結果的時間。若要這樣做,您將建立使用者控制項。使用者控制項將包含執行 Twitter API 的搜尋,以及裝載所需的控制項,以顯示搜尋結果的程式碼。

若要開始,以滑鼠右鍵按一下專案,然後選擇 [加入 |在內容功能表中的新項目。在下列對話方塊中,尋找使用者控制項。將使用者控制項 SearchResults 和按一下 [新增] 所示**[圖 5**。

將新的使用者控制項加入至專案
[圖 5 將新的使用者控制項加入至專案

修改 SearchResults.xaml 檔案,以加入 XAML 中找到**[圖 6**。

[圖 6 SearchResults 使用者控制項的 XAML

<Grid>
  <ListView Name="lvSearchResults" Width="350" >
  <ListView.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="0,4,4,0">
        <Image Source="{Binding User.ProfileImageUrl}" Width="64"
          Margin="8"  ></Image>
          <StackPanel Width="240">
            <TextBlock Text="{Binding Text}"
              TextWrapping="WrapWholeWords"></TextBlock>
            <TextBlock Text="{Binding CreationDate}"
              FontStyle="Italic" ></TextBlock>
            <TextBlock Text="{Binding User.ScreenName}"
              Foreground="Blue"></TextBlock>
            <TextBlock Text="{Binding User.Name}"></TextBlock>
          </StackPanel>
        </StackPanel>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</Grid>

XAML 包含 ListView 和必要的 DataTemplate 顯示 Twitter 搜尋結果。開啟 SearchResults.xaml.cs 檔案,並搜尋結果類別中新增下列屬性︰

public string SearchTerm { get; private set; }

然後,修改搜尋的字詞加入字串參數的建構函式︰

public SearchResults(string searchTerm)
{
  this.InitializeComponent();
  this.SearchTerm = searchTerm;
  Search();
}

現在,新增下列方法︰

private async void Search()
  {
    lvSearchResults.ItemsSource = await  
    TwitterService.Instance.SearchAsync(this.SearchTerm, 50);
  }

Search 方法呼叫 SearchAsync 方法具有兩個參數︰ 搜尋詞彙,並傳回結果的限制。所有基礎的 REST API 配管工作都是 UWP 社群工具組。  

既然 SearchResults 使用者控制項已準備就緒,就完成應用程式的 MainPage.xaml.cs 檔案中加入程式碼的時間。新增下列事件處理常式,如 btnSearch 按鈕控制項︰

private void btnSearch_Click(object sender, RoutedEventArgs e)
  {
    BladeItem bi = new BladeItem();
    bi.Title = txtSearch.Text;
    bi.Content = new SearchResults(txtSearch.Text);
    bladeView.Items.Add(bi);
  }

BladeView 控制項可以包含任意數目的 BladeItems。上述程式碼片段會建立 BladeItem 控制項,並設定 BladeItem 標題的文字,從 [搜尋] 文字方塊。接下來,它將的搜尋詞彙傳遞至建構函式的 SearchResults 使用者控制項的新執行個體設定 BladeItem 控制項的內容。最後,將會加入 BladeItem BladeView。

現在就執行方案。按一下 [登入] 按鈕。出現提示時,輸入您的 Twitter 認證,並要求提供權限授與應用程式。將會關閉視窗和 [搜尋] 面板就會變成可見。輸入幾個搜尋詞彙之後, 您的畫面應該看起來像**[圖 7**。

標記搜尋應用程式的運作
[圖 7 標記搜尋應用程式的運作

加入複本函式

您已經有您感興趣整齊地依刀鋒視窗中的推文時,您需要在文字格式取得資料的方法。理想情況下,您將想要能夠以滑鼠右鍵按一下 (或觸控螢幕裝置上點選,) 而推文的內容複製到剪貼簿。加入這項功能需要 SearchResults 使用者控制項的 XAML 和程式碼部分修改。

在 SearchResults.xaml 檔案中,您想要加入至 ListView 控制項的延伸顯示功能表。ListView 標記內加入下列 XAML 來建立 MenuFlyout 為 ListView 控制項中的資源︰

<ListView.Resources>
  <MenuFlyout x:Name="mfCopyMenu">
    <MenuFlyout.Items>
      <MenuFlyoutItem Name="mfiCopy" Text="Copy" Click="mfiCopy_Click"/>
    </MenuFlyout.Items>
  </MenuFlyout>
</ListView.Resources>

雖然仍在 SearchResults.xaml 檔案中新增下列事件處理常式至 ListView 控制項,以偵測 ListView 是以滑鼠右鍵按一下或點選︰

RightTapped="lvSearchResults_RightTapped"

現在 SearchResults.xaml.cs 檔案中新增下列事件處理常式程式碼︰

private void lvSearchResults_RightTapped(object sender, 
  RightTappedRoutedEventArgs e)
{
  var tweet = ((FrameworkElement)e.OriginalSource).DataContext;
  mfiCopy.Tag = tweet;
  mfCopyMenu.ShowAt(lvSearchResults, 
    e.GetPosition(lvSearchResults));
}

此程式碼的目的是擷取 DataContext 的推文物件,並將它儲存成 MenuFlyoutItem 標記屬性。Tag 屬性繼承自 FrameworkElement,而是儲存自訂物件的相關資訊。一旦選取推文物件儲存在 MenuFlyoutItem 的 Tag 屬性,就顯示延伸顯示功能表的時間。使用者期望他們按一下或點選螢幕上會出現內容功能表。這就是為什麼 ShowAt 方法的程式碼會傳送的事件位置資訊。

現在就加入事件處理常式的 MenuFlyoutItem 控制項和程式碼,以將推文的內容複製到剪貼簿。SearchResults.xaml.cs 檔案中加入下列事件處理常式︰

private void mfiCopy_Click(object sender, RoutedEventArgs e)
{
  var menuFlyoutItemSender = (MenuFlyoutItem)sender;
  var tweet = menuFlyoutItemSender.Tag as Tweet;
  DataPackage dataPackage = new DataPackage();
  dataPackage.RequestedOperation = DataPackageOperation.Copy;
  dataPackage.SetText($"@{tweet.User.ScreenName} {tweet.Text} ");
  Clipboard.SetContent(dataPackage);
}

前兩行程式碼從 MenuFlyoutItem 的 Tag 屬性擷取推文資料。一旦取得的就將資料傳送到剪貼簿的時間。UWP 應用程式,這是由使用 DataPackage 類別。DataPackage 類別的完整探勘已超出本專欄的範圍不過,如果您有興趣進一步了解更多資訊,建議您閱讀 「 複製和貼上 」 文件頁面,在bit.ly/2h54IK0。「 DataPackage 類別 」 文件頁面位於bit.ly/2hpo2Fc

剪貼簿可以穩固的格式化文字和影像的控制代碼。不過,如本專欄中,我想要只在推文的文字內容和 Twitter 的控制代碼進行它的人員。UWP 社群工具組將其儲存為 e,使用者物件中。最後,我可以將剪貼簿內容設 DataPackage 物件。

現在就執行方案,登入,並輸入搜尋字詞。尋找您想要複製、 以滑鼠右鍵按一下或點選以查看內容功能表中,為 shownin 推文**[圖 8**。按一下 [複製]。

測試複製內容功能表上的函數範例推文
[圖 8 測試複製內容功能表上的函數範例推文

現在,執行 [記事本] 或您偏好的文字編輯器] 中,然後選擇 [編輯 |貼上或使用 Ctrl + V。您應該會看到這個推文文字︰ @AndyLeonard 我兄弟和 Frank La Vigne 的朋友,以讀取 「 把惡意 」。:{> https://t.co/JnuAzqO6m5

總結

如您所見,UWP 社群工具組有助於快速開發連接定域機組的 UWP 應用程式。只花了一行程式碼能夠登入 Twitter。搜尋 Twitter 是同樣簡單。大多數的程式碼有多個要處理資料,以及使用者如何與它互動的呈現方式。UWP 社群工具組提供豐富的 UI 控制項,以及簡單明瞭的方式來存取受歡迎的雲端 Api,例如 Twitter。低層級的 REST API 和驗證機制非常抽象清除啟用 IntelliSense 的 api。這可讓開發人員專注於使用者互動的資料,而不是取得資料的方式。UWP 社群工具組可以讓任何 UWP 應用程式,更好而且更容易連接到社交媒體和其他雲端服務。


Frank La Vigne是獨立的顧問,他可以協助客戶充分利用技術,以便建立更好的社群。 定期在他的部落格FranksWorld.com和已製作成 YouTube 頻道呼叫的 Frank 世界電視 (FranksWorld.TV)。

感謝閱本篇文章的下列技術專家︰ David Catuhe