1. 程式人生 > >WPF--自定義控制元件的動態新增以及BackgroundWorker的使用

WPF--自定義控制元件的動態新增以及BackgroundWorker的使用

昨天在網上看見一位博主寫了BackgroundWorker,感覺非常不錯。學習加修改之後,隨手記錄,防止忘記!
在視窗內同一位置,增添旋轉效果圖,程式碼如下:

<Canvas Grid.Row="2" Grid.Column="1" Name="cavLoading" Visibility="Collapsed" RenderTransformOrigin="0.5,0.5"  HorizontalAlignment="Center" VerticalAlignment="Center" Width="120" Height="120">
                <Ellipse Width="15"
Height="15" Canvas.Left="55" Canvas.Top="31" Stretch="Fill" Fill="#FFD1D1F7" Opacity="1.0"/> <Ellipse Width="15" Height="15" Canvas.Left="38" Canvas.Top="39" Stretch="Fill" Fill="Blue" Opacity="0.8"/> <Ellipse Width="15" Height="15" Canvas.Left="36" Canvas.Top
="58" Stretch="Fill" Fill="#FF0000FE" Opacity="0.7"/> <Ellipse Width="15" Height="15" Canvas.Left="52" Canvas.Top="67" Stretch="Fill" Fill="Blue" Opacity="0.6"/> <Ellipse Width="15" Height="15" Canvas.Left="68" Canvas.Top="61" Stretch="Fill" Fill="#FF2E2EFF" Opacity
="0.5"/> <Ellipse Width="15" Height="15" Canvas.Left="69" Canvas.Top="42" Stretch="Fill" Fill="#FF6F6FFF" Opacity="0.4"/> <Canvas.RenderTransform> <RotateTransform x:Name="SpinnerRotate" Angle="0" /> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent="ContentControl.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)" From="0" To="360" Duration="0:0:0.8" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas>

以及旋轉之後的展示圖,程式碼如下:

<Grid Grid.Row="2" Grid.Column="1"  Name="gNewBox"  Margin="21,0,0,0" Visibility="Collapsed"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="106"/>
                    <RowDefinition Height="106"/>
                    <RowDefinition Height="106"/>
                    <RowDefinition Height="106"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                </Grid.ColumnDefinitions>

            </Grid>

因為我是自定義控制元件後臺實現動態新增,所以沒有在佈局內直接新增,動態新增程式碼如下:

 public void ShowStruct()
 {
            var controls = new List<Drawer.Drawer>();
            controls.Clear();
            gNewBox.Children.Clear();           
                var id = 1;
                for (var i = 0; i < 6; i++)
                {
                    for (var j = 0; j < 4; j++)
                    {
                        var bitkyPole = new Drawer.Drawer();
                        bitkyPole.Name = "drawer" + id;
                        bitkyPole.Width = 145;
                        bitkyPole.Height = 65;
                        //在 Grid 中動態新增控制元件
                        gNewBox.Children.Add(bitkyPole);
                        //設定控制元件在 Grid 中的位置
                        Grid.SetRow(bitkyPole, 5 - i);
                        Grid.SetColumn(bitkyPole, j);
                        //將控制元件新增到集合中,方便下一步的使用
                        controls.Add(bitkyPole);
                        //對控制元件使用自定義方法進行初始化
                        // bitkyPole.setContent(id);                      
                        id++;
                   }
            }
 }

以及等待時長的label:

 <Label Grid.Row="1" Grid.Column="1" Width="120" Height="40" VerticalAlignment="Top" HorizontalAlignment="Left" Content="等待時長:" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"></Label>
            <Label Grid.Row="1" Grid.Column="1" Width="120" Height="40" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="130,0,0,0" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Name="lab_pro"></Label>

然後實現BackgroundWorker,程式碼如下:

 BackgroundWorker bgWl;
        private void btnLoading_Click(object sender, RoutedEventArgs e)
        {
            bgWl = new BackgroundWorker();
            bgWl.WorkerReportsProgress = true;
            bgWl.DoWork += new DoWorkEventHandler(bgWl_DoWork);
            bgWl.ProgressChanged += new ProgressChangedEventHandler(bgWl_ProgressChanged);
            bgWl.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWl_RunWorkerCompleted);
            bgWl.RunWorkerAsync();
        }
        void bgWl_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
           cavLoading.Visibility = System.Windows.Visibility.Collapsed;
            gNewBox.Visibility = System.Windows.Visibility.Visible;
            this.Dispatcher.Invoke(new Action(() =>
            {
                this.lab_pro.Content = "完成";
            }));
        }
        void bgWl_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.Dispatcher.Invoke(new Action(() =>
            {
                this.lab_pro.Content = e.ProgressPercentage;
            }));
        }

        void bgWl_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Dispatcher.Invoke(new Action(() =>
            {
             gNewBox.Visibility = System.Windows.Visibility.Collapsed;
             cavLoading.Visibility = System.Windows.Visibility.Visible;
             ShowStruct();
            }));
            GetData();
        }
        public void GetData()
        {
            for (int i = 0; i < 11; i++)
            {
                bgWl.ReportProgress(i);
                System.Threading.Thread.Sleep(500);
            }
        }

相關推薦

WPF--定義控制元件動態新增以及BackgroundWorker的使用

昨天在網上看見一位博主寫了BackgroundWorker,感覺非常不錯。學習加修改之後,隨手記錄,防止忘記! 在視窗內同一位置,增添旋轉效果圖,程式碼如下: <Canvas Grid.Row="2" Grid.Column="1" Name="c

[WPF定義控制元件庫]排序、篩選以及高亮

1. 如何讓列表的內容更容易查詢 假設有這麼一個列表(資料來源在本地),由於內容太多,要查詢到其中某個想要的資料會比較困難。要優化這個列表,無非就是排序、篩選和高亮。 改造過的結果如上。 2. 排序 在WPF中要實現資料排序的功能有很多種,例如用Linq,但這種場景的標準做法是使用Collection

[WPF定義控制元件庫]使用TextBlockHighlightSource強化高亮的功能,以及使用TypeConverter簡化呼叫

1. 強化高亮的功能 上一篇文章介紹了使用附加屬性實現TextBlock的高亮功能,但也留下了問題:不能定義高亮(或者低亮)的顏色。為了解決這個問題,我建立了TextBlockHighlightSource這個類,比單純的字串儲存更多的資訊,這個類的定義如下: 相應地,附加屬性的型別也改變為這個類,並且屬

[WPF定義控制元件庫]瞭解WPF的佈局過程,並利用Measure為Expander新增動畫

1. 前言 這篇文章介紹WPF UI元素的兩步佈局過程,並且通過Resizer控制元件介紹只使用Measure可以實現些什麼內容。 我不建議初學者做太多動畫的工作,但合適的動畫可以引導使用者視線,提升使用者體驗。例如上圖的這種動畫,這種動畫挺常見的,在內容的高度改變時動態地改變自身的高度,除了好看以外,對

WPF定義控制元件(一)の控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

WPF 定義控制元件的坑(蠢的:定義控制元件內容不顯示)

原文: WPF 自定義控制元件的坑(蠢的:自定義控制元件內容不顯示) 自定義控制元件不顯示內容 由於工作需要在寫WPF,其中想要實現一些自己的控制元件所以直接自定義了控制元件博主是繼承了ContenControl的控制元件開始寫的但是發現不管設定Content屬性為任何都是不顯示

WPF定義控制元件(四)の定義控制元件

原文: WPF自定義控制元件(四)の自定義控制元件 在實際工作中,WPF提供的控制元件並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制元件。 這裡LZ總結一些自己的思路,特性如下: Coupling UITemplate Behaviour Function Package

WPF定義控制元件(五)の使用者控制元件(完結)

原文: WPF自定義控制元件(五)の使用者控制元件(完結) 使用者控制元件,WPF中是繼承自UserControl的控制元件,我們可以在裡面融合我們的業務邏輯。 示例:(一個厭惡選擇的使用者控制元件) 後端: using iMicClassBase; using iMicClassBase.B

wpf定義控制元件之依賴屬性

  在wpf開發過程中,總會用到格式各樣的控制元件,但是原生控制元件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控制元件滿足不同的業務需求。 首先說需求吧: 一:根據某個bool值,控制一個圓形控制元件顯示或者不顯示某種顏色。 分析: 一:需

WPF定義控制元件拖拽到介面報錯-未將物件設定到引用的例項

WPF自定義控制元件拖拽到介面報錯-未將物件設定到引用的例項 若給自定義控制元件註冊了許多屬性,那麼在拖拽使用這個控制元件時可能會引起這個錯誤。原因是控制元件初始化時,各個屬性未被顯式賦值。 解決辦法,給控制元件向外暴漏一初始化的方法,類似於這樣 public void XX

【轉】WPF定義控制元件與樣式(3)-TextBox & RichTextBox & PasswordBox樣式、水印、Label標籤、功能擴充套件

一.前言.預覽   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要是對文字輸入控制元件進行樣式開發,及相關擴充套件功能開發,主要內容包括: 基本文字框TextBox控制元件樣式及擴充套件功能,實現了樣式、水印、Label標籤、功

【轉】WPF定義控制元件與樣式(5)-Calendar/DatePicker日期控制元件定義樣式及擴充套件

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要內容: 日曆控制元件Calendar自定義樣式; 日期控制元件DatePicker自定義樣式,及Label標籤、水印、清除日期功能擴充套件; 二.Calend

【轉】WPF定義控制元件與樣式(9)-樹控制元件TreeView與選單Menu-ContextMenu

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 選單Menu的自定義樣式; 右鍵選單ContextMenu的自定義樣式; 樹控制元件TreeView的自定義樣式,及右鍵選單實現。 二.選單M

【轉】WPF定義控制元件與樣式(8)-ComboBox與定義多選控制元件MultComboBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 下拉選擇控制元件ComboBox的自定義樣式及擴充套件; 自定義多選控制元件MultiComboBox; 二.下拉選擇控制元件ComboBox的自

【轉】WPF定義控制元件與樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

【轉】WPF定義控制元件與樣式(12)-縮圖ThumbnailImage /gif動畫圖/圖片列表

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。   本文主要針對WPF專案開發中圖片的各種使用問題,經過總結,把一些經驗分享一下。內容包括: WPF常

【轉】WPF定義控制元件與樣式(13)-定義窗體Window & 適應內容大小訊息框MessageBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 自定義Window窗體樣式; 基於自定義窗體實現自定義MessageBox訊息提示框; 二.自定義Window窗體樣式   自定義的Window

wpf 定義控制元件中ElementName和DataContext之間的衝突

現在發現一個問題,如果在xaml中某個控制元件的屬性通過ElementName綁定了。 大概程式碼如下: /// <summary> /// 輸入點名字 /// </summary> public string Titl

WPF定義控制元件中使用了RadioButton後,多次使用該控制元件出現的死迴圈解決方法

最近在專案中需要用到RadioButton,所以在自定義控制元件中使用了一組RadioButton,使用一個預設的groupname,也就是這個goupname給後來的問題埋下了地雷。 定義大致如下: <Grid> <Label Height ="50" W

WPF定義控制元件之列表滑動特效 PowerListBox

原文: WPF自定義控制元件之列表滑動特效 PowerListBox 列表控制元件是應用程式中常見的控制元件之一,對其做一些絢麗的視覺特效,可以讓軟體增色不少。 本人網上看過一個視訊,是windows phone 7系統上的一個App的列表滾動效果,效果非常炫 現在在WPF上用ListBox重現此效