首页 > 其他分享 >WPF dynamically generate grid with calculated rows and columns, put the custom control in the specif

WPF dynamically generate grid with calculated rows and columns, put the custom control in the specif

时间:2024-09-21 15:02:38浏览次数:1  
标签:control elpImg rows Windows System gd grid new using

private void FillGridRandomly()
{
    rowsColsSet = new HashSet<XY>();
    if (gd != null)
    {
        gd.Children.Clear();
    }


    for (int i = 0; i < 50; i++)
    {
        while (true)
        {
            XY xy = new XY();
            xy.X = rnd.Next(0, rowsCount);
            xy.Y = rnd.Next(0, columnsCount);
            if (!rowsColsSet.Contains(xy))
            {
                rowsColsSet.Add(xy);
                ElpImageTbk elpImg = new ElpImageTbk();
                elpImg.Width = 100;
                elpImg.Height = 50;
                BitmapImage bmp = new BitmapImage();
                bmp.BeginInit();
                bmp.UriSource=new Uri(imgsList[i%imgsCount], UriKind.RelativeOrAbsolute);
                bmp.EndInit();
                bmp.Freeze();
                elpImg.UCElpImgBrush=new ImageBrush(bmp);
                elpImg.UCStr = (i + 1).ToString();
                Grid.SetRow(elpImg, xy.X);
                Grid.SetColumn(elpImg, xy.Y);
                if (!gd.Children.Contains(elpImg))
                {
                    gd.Children.Add(elpImg);
                }
                break;
            }
        }
    }
}

 

 

 

 

 

 

 

 

 

//custom control.xaml
<UserControl x:Class="WpfApp390.ElpImageTbk"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp390"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Ellipse Fill="{Binding UCElpImgBrush,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
        <TextBlock Text="{Binding UCStr,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="50"
                   Foreground="Red"/>
    </Grid>
</UserControl>


//custom control.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp390
{
    /// <summary>
    /// Interaction logic for ElpImageTbk.xaml
    /// </summary>
    public partial class ElpImageTbk : UserControl
    {
        public ElpImageTbk()
        {
            InitializeComponent();
            this.DataContext = this;
        }



        public ImageBrush UCElpImgBrush
        {
            get { return (ImageBrush)GetValue(UCElpImgBrushProperty); }
            set { SetValue(UCElpImgBrushProperty, value); }
        }

        // Using a DependencyProperty as the backing store for UCElpImgBrush.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty UCElpImgBrushProperty =
            DependencyProperty.Register("UCElpImgBrush", typeof(ImageBrush),
                typeof(ElpImageTbk), new PropertyMetadata(null));





        public string UCStr
        {
            get { return (string)GetValue(UCStrProperty); }
            set { SetValue(UCStrProperty, value); }
        }

        // Using a DependencyProperty as the backing store for UCStr.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty UCStrProperty =
            DependencyProperty.Register("UCStr", typeof(string),
                typeof(ElpImageTbk), new PropertyMetadata(""));



    }
}


//cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp390
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Random rnd { get; set; }
        private int width { get; set; }
        private int height { get; set; }
        private Grid gd { get; set; }
        private int rowsCount { get; set; }
        private int columnsCount { get; set; }
        private System.Timers.Timer tmr { get; set; }
        HashSet<XY> rowsColsSet { get; set; }
        private List<string> imgsList { get; set; }
        private int imgsCount { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            this.WindowState = WindowState.Maximized;
            this.Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            InitVariables();
            tmr = new System.Timers.Timer();
            tmr.Elapsed += Tmr_Elapsed;
            tmr.Interval = 2000;
            tmr.Start();
        }

        private void Tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                FillGridRandomly();
            }));
        }

        private void FillGridRandomly()
        {
            rowsColsSet = new HashSet<XY>();
            if (gd != null)
            {
                gd.Children.Clear();
            }


            for (int i = 0; i < 50; i++)
            {
                while (true)
                {
                    XY xy = new XY();
                    xy.X = rnd.Next(0, rowsCount);
                    xy.Y = rnd.Next(0, columnsCount);
                    if (!rowsColsSet.Contains(xy))
                    {
                        rowsColsSet.Add(xy);
                        ElpImageTbk elpImg = new ElpImageTbk();
                        elpImg.Width = 100;
                        elpImg.Height = 50;
                        BitmapImage bmp = new BitmapImage();
                        bmp.BeginInit();
                        bmp.UriSource=new Uri(imgsList[i%imgsCount], UriKind.RelativeOrAbsolute);
                        bmp.EndInit();
                        bmp.Freeze();
                        elpImg.UCElpImgBrush=new ImageBrush(bmp);
                        elpImg.UCStr = (i + 1).ToString();
                        Grid.SetRow(elpImg, xy.X);
                        Grid.SetColumn(elpImg, xy.Y);
                        if (!gd.Children.Contains(elpImg))
                        {
                            gd.Children.Add(elpImg);
                        }
                        break;
                    }
                }
            }
        }

        private void InitVariables()
        {
            imgsList = System.IO.Directory.GetFiles(@"../../Images")?.ToList();
            if(imgsList==null || !imgsList.Any())
            {
                return;
            }
            imgsCount = imgsList.Count;
            rnd = new Random();
            width = (int)this.ActualWidth;
            height = (int)this.ActualHeight;
            columnsCount = width / 100;
            rowsCount = height / 50;
            gd = new Grid();
            gd.ShowGridLines = true;
            for (int i = 0; i < rowsCount; i++)
            {
                RowDefinition row = new RowDefinition();
                gd.RowDefinitions.Add(row);
            }
            for (int i = 0; i < columnsCount; i++)
            {
                ColumnDefinition col = new ColumnDefinition();
                gd.ColumnDefinitions.Add(col);
            }
            this.Content = gd;
        }
    }

    public struct XY
    {
        public int X { get; set; }

        public int Y { get; set; }
    }
}

 

标签:control,elpImg,rows,Windows,System,gd,grid,new,using
From: https://www.cnblogs.com/Fred1987/p/18424016

相关文章