UWP入門一 7天酒店客戶端源碼及說明

来源:http://www.cnblogs.com/emsoro/archive/2016/01/15/5134723.html
-Advertisement-
Play Games

以前寫過一個wp8的工程,說實話那會的代碼很麻煩,寫起來費勁,另外還沒多少人下載,不過到windows 10 開始微軟出了UWP架構以後一切都像以前的winform wpf一樣好轉起來,新建一個工程以後模板很簡潔。現在就開始介紹一下基本控制項的使用,為新手寫程式提供一個例子。7天酒店沒有官方客戶端.....


 

  以前寫過一個wp8的工程,說實話那會的代碼很麻煩,寫起來費勁,另外還沒多少人下載,不過到windows 10 開始微軟出了UWP架構以後一切都像以前的winform wpf一樣好轉起來,新建一個工程以後模板很簡潔。

現在就開始介紹一下基本控制項的使用,為新手寫程式提供一個例子。7天酒店沒有官方客戶端,不過不妨礙拿他做例子。

  由於以前代碼使用到了json.net 為了減少代碼修改,所以還是需要引入進來,但去官方網站下載的無法直接使用,說什麼不適配,只要打開

然後呢搜索Json  其實我打開預設第二個就是

添加好之後呢

開始佈局代碼

在MainPage.xaml中寫如下代碼

<Page
    x:Class="_7inns.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:_7inns"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.Resources>
            <CollectionViewSource x:Name="itemcollectSource" IsSourceGrouped="true" ItemsPath="ItemContent" />
        </Grid.Resources>
        <Image Source="Assets/2.png" Margin="42,23,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="109" Width="94" />
        <TextBlock Margin="42,193,264,0" TextWrapping="Wrap" Text="城市" VerticalAlignment="Top" FontSize="20" FontWeight="Bold"/>
        <TextBlock Margin="42,252,264,0" TextWrapping="Wrap" Text="區域" VerticalAlignment="Top" FontSize="20" FontWeight="Bold"/>
        <Button x:Name="buttonCities" Content="" HorizontalAlignment="Stretch" Margin="104,194,3,0" VerticalAlignment="Top" Click="buttonCities_Click" BorderThickness="1" Height="33"/>
        <SemanticZoom x:Name="semanticZoomCities" Margin="0" ViewChangeCompleted="SemanticZoom_ViewChangeCompleted" Visibility="Collapsed" Canvas.ZIndex="5" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <SemanticZoom.ZoomedInView>
                <ListView x:Name="ListCities" ScrollViewer.IsHorizontalScrollChainingEnabled="False" ScrollViewer.IsVerticalScrollChainingEnabled="False" ItemClick="ListCities_ItemClick" SelectionChanged="ListCities_SelectionChanged">
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.HeaderTemplate>
                                <DataTemplate>
                                    <Border Background="#FFECAE0A" Height="60" Width="60">
                                        <TextBlock Text="{Binding Key}" FontSize="50" Foreground="{ThemeResource ApplicationForegroundThemeBrush}"></TextBlock>
                                    </Border>
                                </DataTemplate>
                            </GroupStyle.HeaderTemplate>
                        </GroupStyle>
                    </ListView.GroupStyle>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding name}" Height="40" FontSize="30"></TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </SemanticZoom.ZoomedInView>
            <SemanticZoom.ZoomedOutView>
                <GridView x:Name="GridCitiesFirstName" ScrollViewer.IsHorizontalScrollChainingEnabled="False" ScrollViewer.IsVerticalScrollChainingEnabled="False" Margin="0,100" HorizontalAlignment="Center" VerticalAlignment="Center">
                    <GridView.ItemTemplate>
                        <DataTemplate>
                            <Border Height="60">
                                <TextBlock Text="{Binding Group.Key}" FontSize="24"></TextBlock>
                            </Border>
                        </DataTemplate>
                    </GridView.ItemTemplate>
                    <GridView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapGrid ItemWidth="60" ItemHeight="60" VerticalChildrenAlignment="Center" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </ItemsPanelTemplate>
                    </GridView.ItemsPanel>
                    <GridView.ItemContainerStyle>
                        <Style TargetType="GridViewItem">
                            <Setter Property="BorderBrush" Value="Gray" />
                            <Setter Property="Background" Value="#FFECAE0A" />
                            <Setter Property="BorderThickness" Value="3" />
                            <Setter Property="HorizontalContentAlignment" Value="Center" />
                            <Setter Property="VerticalContentAlignment" Value="Center" />
                        </Style>
                    </GridView.ItemContainerStyle>
                </GridView>
            </SemanticZoom.ZoomedOutView>
        </SemanticZoom>
        <ComboBox x:Name="comboBoxDistricts" Margin="107,251,0,0" VerticalAlignment="Top" BorderThickness="1" SelectionChanged="comboBoxDistricts_SelectionChanged" Width="251"/>
        <TextBlock Margin="42,368,264,0" TextWrapping="Wrap" Text="關鍵字" VerticalAlignment="Top" FontSize="20" FontWeight="Bold"/>
        <TextBlock Margin="42,442,264,0" TextWrapping="Wrap" Text="入住時間" VerticalAlignment="Top" FontSize="20" FontWeight="Bold"/>
        <Button x:Name="search" Content="搜索" HorizontalAlignment="Right" Margin="0,0,10,49" VerticalAlignment="Bottom" Click="search_Click" FontSize="20" FontWeight="Bold" BorderThickness="1" RenderTransformOrigin="0.925,0.455" Width="129"/>
        <DatePicker x:Name="inRoomDate" Margin="96,454,0,0" VerticalAlignment="Top" DateChanged="inRoomDate_DateChanged" BorderThickness="1" Width="255"/>
        <TextBox x:Name="keyword" Margin="104,358,1,0" TextWrapping="Wrap" VerticalAlignment="Top"/>

    </Grid>
</Page>

恕當時沒什麼佈局概念,基本就是手動佈局,羅列控制項。佈局的事情以後再慢慢寫,不過微軟的教程或者其他書裡面這塊講的很清楚,各種panel grid 佈局。

這個裡面基本就是一些textblock 跟textbox button 和一個SemanticZoom  SemanticZoom的效果就是聯繫人菜單那個感覺,這裡用來選擇城市

先看一下選擇前的

 

點一下字母 就會有

然後可以選個北京

後臺呢就會對這個選擇的city進行行政區查詢

        private async void ListCities_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Debug.WriteLine("ListCities_SelectionChanged");

            if (e.AddedItems.Count == 1)
            {
                currentCityItem = (CityItem)e.AddedItems.First();
                Debug.WriteLine(currentCityItem.name);
                buttonCities.Content = currentCityItem.name;
            }

            string di = await FindDistrict(currentCityItem.id);
            int total = di.Length;
            semanticZoomCities.Visibility = Visibility.Collapsed;
            if (total <= 6)
                return;

            JArray jobjectAllDistricts = JArray.Parse(di);
            comboBoxDistricts.PlaceholderText = "";
            comboBoxDistricts.Items.Clear();
            if (DItem != null)
            {
                DItem.Clear();
                for (int i = 0; i < jobjectAllDistricts.Count; i++)
                {
                    DItem.Add(new DistrictItem { id = (string)jobjectAllDistricts[i]["id"], name = (string)jobjectAllDistricts[i]["name"] });
                    //Debug.WriteLine((string)jobjectAllDistricts[i]["name"]);

                    comboBoxDistricts.Items.Add((string)jobjectAllDistricts[i]["name"]);
                }
            }







            Debug.WriteLine("Total bytes returned:  " + total);


        }
FindDistrict這個函數就需要用到http請求了

當時這麼寫的 可能是win10推薦的代碼 不過能用
        private async Task<string> FindDistrict(string id)
        {
            string url = @"http://m.7daysinn.cn/q/city/" + id + @"/districts";

            HttpClientHandler handler = new HttpClientHandler();

            handler.AllowAutoRedirect = false;



            HttpClient httpClient = new HttpClient(handler);



            // Limit the max buffer size for the response so we don't get overwhelmed

            httpClient.MaxResponseContentBufferSize = 256000;
            string result;
            try
            {
                result = await httpClient.GetStringAsync(url);
                return result;
            }
            catch (Exception)
            {

            }

            return "";
        }

點擊搜索按鈕
就可以得到這個日子的酒店列表啦
        private async void search_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string url = @"http://m.7daysinn.cn/q/inns?cityId=" + currentCityItem.id;

                if (currentDistrictItem != null && currentDistrictItem.id != "")
                {
                    url += "&districtId=";
                    url += currentDistrictItem.id;
                }

                if (keyword.Text != "")
                {
                    url += "&keyword=";
                    url += Uri.EscapeUriString(keyword.Text);
                }


                url += "&fromDate=" + inDate.Date.ToString("yy-MM-dd") + "&days=1&getQuota=true";

                HttpClientHandler handler = new HttpClientHandler();

                handler.AllowAutoRedirect = false;



                HttpClient httpClient = new HttpClient(handler);



                // Limit the max buffer size for the response so we don't get overwhelmed

                httpClient.MaxResponseContentBufferSize = 256000;
                ParameterObject po = new ParameterObject();
                po.result = await httpClient.GetStringAsync(url);
                po.date = inDate;
                Frame.Navigate(typeof(InnStatus), po);
            }
            catch (Exception)
            {

            }


        }
Frame.Navigate(typeof(InnStatus), po);這句呢就是把數據傳到第二個頁面

第二個頁面Innstatus 解析並且展示出來
 protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            innstatus = (ParameterObject)e.Parameter;
            try
            {
                List<InnItem> innItems = new List<InnItem>();
                JObject jobjectAllInns = JObject.Parse(innstatus.result);
                JArray jaRooms = (JArray)jobjectAllInns["content"];

                for (int i = 0; i < jaRooms.Count; i++)
                {
                    innItems.Add(new InnItem
                    {
                        innId = (string)jaRooms[i]["innId"],
                        name = (string)jaRooms[i]["name"],
                        firstCharsOfPinyin = (string)jaRooms[i]["firstCharsOfPinyin"],
                        cityId = (string)jaRooms[i]["cityId"],
                        cityName = (string)jaRooms[i]["cityName"],
                        districtId = (string)jaRooms[i]["districtId"],
                        districtName = (string)jaRooms[i]["districtName"],
                        address = (string)jaRooms[i]["address"],
                        score = (string)jaRooms[i]["score"],
                        orderWeight = (string)jaRooms[i]["orderWeight"],
                        thumbnailPath = (string)jaRooms[i]["thumbnailPath"],
                        lowestPrice = (string)jaRooms[i]["lowestPrice"],
                        hasRoom = (string)jaRooms[i]["hasRoom"],
                        hasWifi = (string)jaRooms[i]["hasWifi"],
                        hasPark = (string)jaRooms[i]["hasPark"],
                        canUseCashCoupon = (string)jaRooms[i]["canUseCashCoupon"],
                        brandId = (string)jaRooms[i]["brandId"],
                        //currentActivities = (string)jaRooms[i]["currentActivities"],
                    });



                }

                this.inncollectSource.Source = innItems;
                ContentInnsList.ItemsSource = inncollectSource.View;
                
            }
            catch (Exception)
            { }

        }

效果如下

 
第二個頁面的xaml代碼就這麼寫的
一個數據模板
<Page
    x:Class="_7inns.InnStatus"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:_7inns"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid x:Name="LayoutRoot">

        <Grid.ChildrenTransitions>
            <TransitionCollection>
                <EntranceThemeTransition/>
            </TransitionCollection>
        </Grid.ChildrenTransitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- TitlePanel -->
        <StackPanel Grid.Row="0" Margin="0" Orientation="Horizontal">
            <TextBlock Text="酒店狀態" Style="{ThemeResource TitleTextBlockStyle}" Typography.Capitals="SmallCaps" Margin="0,15,0,16.5" RenderTransformOrigin="1.473,0.155" Width="300" TextAlignment="Center"/>
        </StackPanel>

        <!--TODO: Content should be placed within the following grid-->
        <Grid Grid.Row="1" x:Name="ContentRoom">
            <Grid.Resources>
                <CollectionViewSource x:Name="inncollectSource" IsSourceGrouped="False" ItemsPath="" />
            </Grid.Resources>
            <ListView x:Name="ContentInnsList" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" IsItemClickEnabled="True" ItemClick="ContentInnsList_ItemClick">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding name}" Height="40" FontSize="30"></TextBlock>
                            <TextBlock Text="{Binding address}" Height="30" FontSize="14" Foreground="#FFECAE0A"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

        </Grid>
        
    </Grid>
</Page>

好啦 要介紹的就這麼多

工程我上傳上來好了方便新手調試

http://files.cnblogs.com/files/emsoro/7inns.zip

 

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相信很多博友在開發初次接觸學習C# winForm時,當窗體大小變化時,窗體內的控制項並沒有隨著窗體的變化而變化,最近因為一個項目工程的原因,也需要解決這個問題。通過查閱和學習,這個問題得到瞭解決,或許不是很好的處理方式,但是也值得借鑒。。。 下麵我將建立一個Demo來大概解釋下這個方法的實現:(註:...
  • public class WaitQueue : IDisposable where T : class { /// /// The deal action. /// public Action DealActio...
  • 因為框架使用了字體文件來顯示矢量的圖標,為了能在IIS上正常顯示圖標,可以通過增加iis的MIME-TYPE來支持圖標字體文件:增加以下兩種文件類型即可:.woff application/x-woff.svg image/svg+xml最後還可以查看樣式是否有發佈進去,如果沒有直接把樣式考進去覆蓋...
  • 結果顯示:marc顯示:卡片顯示:程式一個類: public class MARC { #region 界面上要顯示的元素 public string ztm = "";//正題名 public string ftm = "";//副題名 ...
  • 來源:http://zxlovenet.cnblogs.com 偽彩色處理是指將灰度圖像轉換成彩色圖象。因為人眼對於彩色的分辨能力遠高於對灰度圖像的分辨能力,所以將灰度圖像轉換成彩色可以提高人眼對圖像細節的辨別能力。偽彩色並不能真實的反映圖像像的彩色情況。 效果圖: 強度分層法和灰度級-彩色...
  • 1. 日期控制項的使用(如下圖所示,點擊空白處彈出日曆) (1)首先下載AjaxControlToolkit.dll(2)文件起始處添加下麵的語句(3)再添加下麵的語句2. 樣例
  • //可以上傳圖片,txt文檔。doc,wps,還有音頻文件,視屏文件等,功能強大啊!//前臺代碼片,設置上傳圖片的界面 //後臺代碼 ,實現圖片從客戶...
  • 原文鏈接:http://docs.autofac.org/en/latest/getting-started/index.html在程式中使用Autofac的基本模式是:用控制反轉(IoC)的思想組織程式。添加對 Autofac 的引用。程式啟動階段創建 ContainerBuilder。註冊組件。...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...