欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WPF--自定义控件的动态添加以及BackgroundWorker的使用

程序员文章站 2022-01-05 10:51:19
...

昨天在网上看见一位博主写了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);
            }
        }
相关标签: 控件