WPF 蒙罩層 LoadingPage

前言

無論是在PC客戶端,移動端,網(wǎng)站偎蘸,在遇到長時間處理的時候都會需要用到蒙罩層,讓用戶有更好的體現(xiàn)瞬内。今天上網(wǎng)逛了一下各位前輩網(wǎng)友的蒙罩層的實現(xiàn)方式迷雪,覺得有很多都搞復(fù)雜了(利用前臺代碼+后臺代碼+數(shù)學(xué)計算),無疑增加了維護的難度遂鹊。然而振乏,本人參考了各位前輩的實現(xiàn)以后,自己實現(xiàn)了一個可重用LoadingPage控件秉扑,歡迎各位下載使用慧邮。

需求

需求先行是必須的,我的目標(biāo)是做成怎樣一個效果呢舟陆?

1. 是一個控件误澳,可以在.NET各環(huán)境中得以重用。

2. 可配置秦躯,例如顏色忆谓,大小,提醒字符串等等的屬性踱承,用戶可以自定義倡缠,以滿足用戶所在情況的需求哨免。

3. 大小比例自適應(yīng),不同大小的窗口載體昙沦,能自動改變自身大小比例琢唾。

4. 效果全部xaml實現(xiàn),全部集中于xaml可控制難度不會大盾饮,維護起來方便采桃,用戶拷貝xaml也方便。

解決方法

1. 新建WPF用戶控件庫進行開發(fā)丘损。

2. 使用依賴項屬性普办,然后前臺xaml使用屬性綁定來實現(xiàn)。

3. 使用ViewBox控件(該控件能夠自動縮放內(nèi)容)徘钥。

4. 在xaml中的寫動畫代碼衔蹲。

結(jié)果展示

制作過程

1. 新建一個"WPF用戶控件庫"工程,新建一個WPF控件吏饿。(這步不解釋)

2. 為了實現(xiàn)蒙罩效果踪危,我們把控件的背景弄成黑色背景,并且透明度為0.2猪落。

    <UserControl.Background>
        <SolidColorBrush Color="Black" Opacity="0.2" ></SolidColorBrush>
    </UserControl.Background>

3. 然后就是先利用Canvas作為背景贞远,在其上畫一個由小圓圈構(gòu)成的大圈,使用控件Ellipse笨忌。

      <Canvas RenderTransformOrigin="0.5,0.5" 
                    HorizontalAlignment="Center"  x:Name="loadCancas"
                    VerticalAlignment="Center" Width="120"  
                    Height="120" >
                <Canvas.Resources>
                    <Style TargetType="Ellipse">
                        <Setter Property="Width" Value="10" ></Setter>
                        <Setter Property="Height" Value="10" ></Setter>
                        <Setter Property="Canvas.Left" Value="30"></Setter>
                        <Setter Property="Canvas.Top" Value="30"></Setter>
                        <Setter Property="Stretch" Value="Fill"></Setter>
                        <Setter Property="Fill" Value="Blue"></Setter>
                        <Setter Property="RenderTransformOrigin" Value="3,3"></Setter>
                    </Style>
                </Canvas.Resources>
                <Ellipse >
                </Ellipse>
                <Ellipse Opacity="0.9">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="36"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.8">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="72"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.7">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="108"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.6">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="144"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.5">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="180"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.4">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="216"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.3">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="252"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.2">
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="288"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Ellipse Opacity="0.1" >
                    <Ellipse.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="324"/>
                        </TransformGroup>
                    </Ellipse.RenderTransform>
                </Ellipse>
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <RotateTransform x:Name="SpinnerRotate"  
                         Angle="0" />
                    </TransformGroup>
                </Canvas.RenderTransform>
            </Canvas>
        </Grid>

這樣就形成了一個圈蓝仲,然后為了實現(xiàn)目標(biāo)3(內(nèi)容能自動改變大小),使用一個viewBox作為容器官疲,包住這個Canvas袱结。(不貼代碼了)

4. 旋轉(zhuǎn)動畫編寫。

因為我在Canvas畫了一個圈途凫,然而我只需無限旋轉(zhuǎn)Canvas便可實現(xiàn)像小圓圈在動一樣垢夹。下面看一下Canvas的觸發(fā)器,在觸發(fā)器中實現(xiàn)動畫的編寫维费。

<Canvas.Triggers>
  <EventTrigger RoutedEvent="Loaded">
    <BeginStoryboard Name="loadAnimation">
      <Storyboard>
        <DoubleAnimation Storyboard.TargetName="loadCancas" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)" From="360" To="0" RepeatBehavior="Forever" Duration="0:0:3"></DoubleAnimation>
          </Storyboard>
       </BeginStoryboard>
    </EventTrigger>
    <EventTrigger RoutedEvent="Unloaded">
    <StopStoryboard BeginStoryboardName="loadAnimation"></StopStoryboard>
    </EventTrigger>
</Canvas.Triggers>

5. 屬性可配置果元,使用依賴屬性,并且在xaml中寫綁定犀盟,下面先看后臺代碼中的依賴項屬性的定義阅畴,然后前臺綁定就補貼了,統(tǒng)一在附件中可以看到。

public partial class LoadingPage : UserControl
    {
        public LoadingPage()
        {
            InitializeComponent();
        }

        #region 加載圓圈的margin
        [DescriptionAttribute("加載圓圈的margin"), CategoryAttribute("擴展"), DefaultValueAttribute(0)]
        public string LoadCirclesMargin
        {
            get { return (string)GetValue(LoadCirclesMarginProperty); }
            set { SetValue(LoadCirclesMarginProperty, value); }
        }


        public static readonly DependencyProperty LoadCirclesMarginProperty =
            DependencyProperty.Register("LoadCirclesMargin", typeof(string), typeof(LoadingPage),
            new FrameworkPropertyMetadata("50"));
        #endregion

        #region 加載中的提示
        [DescriptionAttribute("加載中的提示"), CategoryAttribute("擴展"), DefaultValueAttribute(0)]
        public string LoadingText
        {
            get { return (string)GetValue(LoadingTextProperty); }
            set { SetValue(LoadingTextProperty, value); }
        }


        public static readonly DependencyProperty LoadingTextProperty =
            DependencyProperty.Register("LoadingText", typeof(string), typeof(LoadingPage),
            new FrameworkPropertyMetadata("加載中"));
        #endregion

        #region 加載中的提示的字體大小
        [DescriptionAttribute("加載中的提示的字體大小"), CategoryAttribute("擴展"), DefaultValueAttribute(0)]
        public int LoadingTextFontSize
        {
            get { return (int)GetValue(LoadingTextFontSizeProperty); }
            set { SetValue(LoadingTextFontSizeProperty, value); }
        }


        public static readonly DependencyProperty LoadingTextFontSizeProperty =
            DependencyProperty.Register("LoadingTextFontSize", typeof(int), typeof(LoadingPage),
            new FrameworkPropertyMetadata(12));
        #endregion

        #region 圓圈的顏色
        [DescriptionAttribute("圓圈的顏色"), CategoryAttribute("擴展"), DefaultValueAttribute(0)]
        public Brush CirclesBrush
        {
            get { return (Brush)GetValue(CirclesBrushProperty); }
            set { SetValue(CirclesBrushProperty, value); }
        }


        public static readonly DependencyProperty CirclesBrushProperty =
            DependencyProperty.Register("CirclesBrush", typeof(Brush), typeof(LoadingPage),
            new FrameworkPropertyMetadata(Brushes.Black));
        #endregion

        #region 加載中的提示的字體顏色
        [DescriptionAttribute("加載中的提示的字體顏色"), CategoryAttribute("擴展"), DefaultValueAttribute(0)]
        public Brush LoadingTextForeground
        {
            get { return (Brush)GetValue(LoadingTextForegroundProperty); }
            set { SetValue(LoadingTextForegroundProperty, value); }
        }


        public static readonly DependencyProperty LoadingTextForegroundProperty =
            DependencyProperty.Register("LoadingTextForeground", typeof(Brush), typeof(LoadingPage),
            new FrameworkPropertyMetadata(Brushes.DarkSlateGray));
        #endregion
    }

大功告成;菏臁Kん浴!彰触!上面的代碼都是為了展示原理而分拆出來的零碎代碼况毅,如果想使用該控件尔许,可以點下面的

下載Demo下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棠耕,一起剝皮案震驚了整個濱河市余佛,隨后出現(xiàn)的幾起案子窍荧,更是在濱河造成了極大的恐慌郊楣,老刑警劉巖茉贡,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放椰,居然都是意外死亡拿撩,警方通過查閱死者的電腦和手機错邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門撬呢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毛仪,“玉大人刨晴,你說我怎么就攤上這事蝶桶。” “怎么了掉冶?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵真竖,是天一觀的道長。 經(jīng)常有香客問我厌小,道長恢共,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任璧亚,我火速辦了婚禮讨韭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己透硝,他們只是感情好狰闪,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著濒生,像睡著了一般埋泵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罪治,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天丽声,我揣著相機與錄音,去河邊找鬼觉义。 笑死恒序,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谁撼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼滋饲,長吁一口氣:“原來是場噩夢啊……” “哼厉碟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屠缭,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤箍鼓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呵曹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體款咖,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年奄喂,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐殃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡跨新,死狀恐怖富腊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情域帐,我是刑警寧澤赘被,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站肖揣,受9級特大地震影響民假,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龙优,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一羊异、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦球化、人聲如沸秽晚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赴蝇。三九已至,卻和暖如春巢掺,著一層夾襖步出監(jiān)牢的瞬間句伶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工陆淀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留考余,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓轧苫,卻偏偏與公主長得像楚堤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子含懊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,526評論 25 707
  • 目錄 什么是WPF身冬? WPF的歷史? 為什么要用WPF及WPF作用 WPF與winForm區(qū)別岔乔? 什么是WPF酥筝? ...
    灬52赫茲灬閱讀 5,780評論 2 11
  • 春夏秋冬四季中,我最喜歡的是秋冬兩季雏门。 夏天太熱嘿歌,容易灼燒人。南國北國皆酷暑難當(dāng)茁影。只有東北宙帝,青藏高原,才可免收酷暑...
    棲居俠客閱讀 204評論 0 1
  • **目錄 | **《讓我們試著明智生活》目錄**上回 | **是誰在偷走你的時間募闲?黑名單與白名單——讓我們試著明智...
    梧薌閱讀 1,730評論 11 28
  • 光影時刻
    浪漫咖啡杯閱讀 196評論 0 0