分享大麥UWP版本開發歷程-01.響應式輪播頂部焦點圖

来源:http://www.cnblogs.com/Damai-Pang/archive/2016/02/19/5201206.html
-Advertisement-
Play Games

話說有一天,臨近下班無心工作,在網上看各種文章,閱讀到了一篇名為《聊聊大麥網UWP版的首頁頂部圖片聯動效果的實現方法》(傳遞:http://www.cnblogs.com/hippieZhou/p/4755290.html),看到別人評論自己做的產品,頓時來了興趣,閱讀過後,hippieZhou童鞋


    話說有一天,臨近下班無心工作,在網上看各種文章,閱讀到了一篇名為《聊聊大麥網UWP版的首頁頂部圖片聯動效果的實現方法》(傳遞:http://www.cnblogs.com/hippieZhou/p/4755290.html),看到別人評論自己做的產品,頓時來了興趣,閱讀過後,hippieZhou童鞋基本把這個自動輪播控制項的原理精髓都講到了,我就在這裡,順著Zhou同學的文章,接著分享一下更細節一點的東西。

    今天要跟大家分享的,就是這個簡單的控制項,在響應式佈局裡面做的工作。其中有用過微軟提供的XAML觸發器,也用過土辦法,監聽Size_Changed事件,林林總總的,感覺處理這個響應式佈局,比做後臺邏輯費得時間和精力更大。總結下來,兩種方式都可以達到最終的效果,使用觸發器,在XAML裡面,代碼少,而且直接操作控制項狀態,比較贊。但是因為這個控制項在縮放過程中涉及到的東西太多,而且需要某些複雜計算,最終權衡下,這個控制項還是使用了傳統的Size_Changed事件,後臺對界面進行操控。

    大麥UWP這個輪播控制項,在大屏幕(我以後管寬度大於768的,叫大屏幕)的時候,儘可能的去按照比例,最清晰的去展示焦點廣告。在中等屏幕(寬度小於768並且大於480)時,隨著窗體的變化,保證中間焦點廣告顯示內容,顯示比例不變的前提,壓縮或者展開兩側的輪播廣告。在小屏幕(屏幕寬度小於480)時,隱藏兩側輪播圖,根據當前窗體寬度,按照圖片原有比例縮放中央輪播圖,效果如下圖展示。

看看代碼前臺代碼,其實非常簡單,就是之前Zhou同學說的,總共三個FilpView,以及兩側覆蓋上去的漸變色。這裡需要註意的是,因為要手動控製圖片的縮放,所以Stretch都是None

<UserControl
    x:Class="Damai.Windows10.App.AutoRollBannerView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Damai.Windows10.App"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="360"
    d:DesignWidth="1200">

    <RelativePanel x:Name="layoutRoot" SizeChanged="layoutRoot_SizeChanged">

        <Grid x:Name="gridLeftImage" Width="1">

            <FlipView x:Name="flipPre" BorderThickness="0" ItemsSource="{Binding}">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=Pic}" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="None"/>
                    </DataTemplate>
                </FlipView.ItemTemplate>
            </FlipView>

            <Rectangle>
                <Rectangle.Fill>
                    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                        <GradientStop Color="Black" Offset="0"/>
                        <GradientStop Color="#99000000" Offset="1"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
        </Grid>

        <Grid x:Name="gridCenterImage" RelativePanel.RightOf="gridLeftImage">
            <FlipView x:Name="flipCenter" BorderThickness="0" ItemsSource="{Binding}" SelectionChanged="flipCenter_SelectionChanged">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=Pic}" ImageOpened="ImageCenter_ImageOpened" ImageFailed="ImageCenter_ImageFailed" HorizontalAlignment="Left" VerticalAlignment="Top" Tapped="Image_Tapped"/>
                    </DataTemplate>
                </FlipView.ItemTemplate>
            </FlipView>

            <!--導航-->
            <StackPanel x:Name="stackPanelIndex" Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,14,14"/>

            <Grid x:Name="gridNoData" Background="#D2D2D2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                <Image x:Name="ImageNoData" Source="/Assets/Images/Search/pic_Search_NoData.png" Width="100" Visibility="Visible" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </Grid>

        <Grid x:Name="gridRightImage" RelativePanel.RightOf="gridCenterImage">

            <FlipView x:Name="flipNext" BorderThickness="0" ItemsSource="{Binding}" IsEnabled="False">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Image Source="{Binding Path=Pic}" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="None"/>

                            <Rectangle>
                                <Rectangle.Fill>
                                    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                                        <GradientStop Color="#FF000000" Offset="1"/>
                                        <GradientStop Color="#99000000"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>

                            </Rectangle>
                        </Grid>

                    </DataTemplate>
                </FlipView.ItemTemplate>
            </FlipView>


        </Grid>

    </RelativePanel>

</UserControl>

後臺代碼,如何定時滾動等等,請參看之前Zhou同學的文章即可,這裡不再贅述,唯一做的就是製作了一個私有方法,在控制項的SizeChanged時,還有初始化的時候,調用了一次

 private void Refresh(double width)
        {
            if (this.DataSource == null || _init == false)
            {
                flipCenter.Width = width;
                return;
            }

            if (width <= _imageWidth)
            {
                flipCenter.Height = this.ActualWidth / _scale;
            }
            else
            {
                flipCenter.Height = _imageWidth / _scale;
            }

            double leftWidth = width >= _imageWidth ? (double)(width - _imageWidth) / 2.0 : 0;
            gridLeftImage.Width = leftWidth;
            gridLeftImage.Height = flipCenter.Height;

            gridRightImage.Width = leftWidth;
            gridRightImage.Height = flipCenter.Height;
        }

這樣,大麥UWP客戶端的頂部輪播焦點圖,就基本完成了。

後面我會儘力去把自己開發過程中遇到過的問題,以及解決方法記錄下來,與大家一一分享,儘量不挖坑,謝謝大家。

 


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

-Advertisement-
Play Games
更多相關文章
  • 在程式中建立如下方法。 #region 刷新數據源 /// ///刷新數據源 /// /// dgv that is needed to refresh public void RefreshDataSourceOndgv(DataGridView dgv) ...
  • 在代碼生成工具的各種功能規劃中,我們一向以客戶的需求作為驅動,因此也會根據需要增加一些特殊的功能或者處理。在實際的開發中,雖然我們一般以具體的表進行具體業務開發,但是有些客戶提出有時候視圖開發也是很常見的,為了提高代碼生成和界面生成的效率,基於視圖開發的過程也應該支持。還有主從表的界面生成操作,在很...
  • 最近在做個包含了大量重覆樣式的控制項的網站. 如果用MVC的話,我可以針對每個需要單獨塊編輯的Model寫一個局部視圖. 然後根據不同邏輯需求拼起來.用現成MVC框架非常容易做到. 但環境是3.5的最高只能用MVC2,沒有razor語法,加上沒裝開發環境. 於是想乾脆自己寫一個模板生成HTML的框架,
  • 這個是2011年寫的一個技術貼,現在看可能有點過時了,有興趣的朋友也可以看一下。 一. 描述 在開發winform程式時不會考慮頁面刷新問題,只要控制好線程別導致假死就ok了,但是在開發web頁面程式時,刷新有的時候真是頭痛的很。頁面回調可以解決這個問題,下麵簡單就實用來講對callback做下介紹
  • 前言: NPOI 技術在別人看來可能有點老生長談了,但是對於我現在處於的這個創業型公司,還是挺前沿的,不知道是前輩們不知道這個技術,還是懶得去對現有的軟體進行修改,因為在現有的軟體中,幾乎所有的數據導入導出都是依賴於: Excel.Application(設置excel組件,系統許可權,然後還得考慮版
  • 1、sealed 修飾符 概念: C#提出了一個密封類(sealed class)的概念,幫助開發人員來解決這一問題。 密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個密封類作為其它類的基類,C#將提示出錯。理所當然,密封類不能同時又是抽象類,因為抽象總是希望被
  • ---恢復內容開始--- RazorEngine模板引擎大大的幫助了我們簡化字元串的拼接與方法的調用,開源之後,現在在簡單的web程式,winform程式,甚至控制台程式都可以利用它來完成。 但如何在使用中調用方法和使用自定義模板呢?來看這樣一個例子 1 string str="hello @Mod
  • 使用Visual Studio寫代碼,經常遇到的一個問題就是切換中文輸入法麻煩,輸入完註釋//,要切換到中文,輸入完引號,要輸入中文,然後還需要切換回來,有沒有? 有時候中文輸入法忽然失效有沒有?明明在中文輸入法狀態下,輸入不了中文,有沒有?
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...