Membuat _MouseLeftButtonDown untuk persegi panjang yang dibuat secara dinamis di WPF

Aplikasi saya menunjukkan tata letak lantai kantor di mana kursi digambarkan sebagai persegi panjang dan margin, guratan, tinggi, lebar, dan perataan disimpan dalam database untuk setiap ID Kursi. Berdasarkan status alokasi, isi persegi panjang berwarna merah atau hijau. Status alokasi dan detail hunian disimpan di SQL db. Saya perlu memiliki metode MouseLeftButtonDown terpisah untuk setiap persegi panjang. yang akan menunjukkan kepada saya detail penghuninya.

//Code Behind
public SeatUserControl()
        {
         string cubeId = "";
         string status = "";
         string name = "";
         string number = "";
         int height = 0;
         int width = 0;
         int leftMargin = 0;
         int topMargin = 0;
            InitializeComponent(); 
            SqlDataAdapter data = new SqlDataAdapter();
            DataTable dt = new DataTable();
            string SqlQuery = "select c.SeatId,c.Height,c.Width,c.Stroke,c.MarginTop,c.MarginLeft,e.Status,e.EmpName,e.EmpNumber from SeatDetails c Join MasterData e ON c.SeatId =e.SeatId";
            SqlConnection sqlconn = new SqlConnection(connectionstring);
            sqlconn.Open();
            data = new SqlDataAdapter(SqlQuery, sqlconn);
            data.Fill(dt);
            try
            {
                foreach (DataRow row in dt.Rows)
                {
                    leftMargin = int.Parse(row["MarginLeft"].ToString());
                    topMargin = int.Parse(row["MarginTop"].ToString());
                    height = int.Parse(row["Height"].ToString());
                    width = int.Parse(row["width"].ToString());
                    status = row["Status"].ToString();
                    cubeId = row["SeatId"].ToString();
                    name = row["EmpName"].ToString();
                    number = row["EmpNumber"].ToString();
                    PlaceRectangles();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            sqlconn.Close();
        }
        public string PlaceRectangles()
        {
            Rectangle rect = new Rectangle();
            rect.Height = height;
            rect.Width = width;
            SolidColorBrush StrokeBrush = new SolidColorBrush(Colors.Black);
            rect.Stroke = StrokeBrush;
            rect.VerticalAlignment = VerticalAlignment.Top;
            rect.HorizontalAlignment = HorizontalAlignment.Left;
            rect.Margin = new Thickness(leftMargin, topMargin, 0, 0);
            rect.RadiusX = 8;
            rect.RadiusY = 5;
           if (status.Equals("Allocated"))
            {
                SolidColorBrush myBrush = new SolidColorBrush(Colors.RoyalBlue);
                rect.Fill = myBrush;
            }
           else if (status.Equals("Available"))
            {
                SolidColorBrush myBrush = new SolidColorBrush(Colors.Red);
                rect.Fill = myBrush;
            }
           else 
            {
                SolidColorBrush myBrush = new SolidColorBrush(Colors.White);
                rect.Fill = myBrush;
            }
            seatCanvas.Children.Add(rect);
     }
}

//XAML
<UserControl x:Class="SpaceAllocator.SeatUserControl"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="580" d:DesignWidth="800">
    <Grid Height="580" Width="800">
        <Canvas Name="seatCanvas" Height="580" Width="800" Margin="0,3,-2,78">       </Canvas>
    </Grid>
</UserControl>
enter code here

person Ram Murti    schedule 12.03.2014    source sumber
comment
Sangat disarankan agar Anda menggunakan DataBinding yang tepat dan ItemsControl yang tepat serta DataTemplate yang tepat daripada membuat dan memanipulasi elemen UI dalam kode prosedural di WPF. Pendekatan tersebut tidak disarankan karena bermasalah karena kompleksitas Pohon Visual, dan rumit karena sifat proseduralnya yang secara umum memerlukan lebih banyak kode dan kurang elegan dibandingkan pendekatan deklaratif berbasis DataBinding. Posting kode Anda saat ini dan XAML dan saya dapat memberi tahu Anda cara yang tepat untuk melakukan apa yang Anda perlukan di WPF.   -  person Federico Berasategui    schedule 12.03.2014
comment
Hai, @HighCore Saya telah menyertakan kode di belakang dan XAML yang digunakan dalam aplikasi saya. Mohon sarankan cara yang lebih baik.   -  person Ram Murti    schedule 13.03.2014
comment
@HighCore, bisakah kita melakukannya dengan cara yang lebih baik?   -  person Ram Murti    schedule 20.03.2014
comment
Saya akan menyiapkan sampel kecil untuk Anda.   -  person Federico Berasategui    schedule 20.03.2014


Jawaban (2)


Saat Anda membuat persegi panjang, tambahkan event handler:

System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle();
rect.MouseLeftButtonDown += rect_MouseLeftButtonDown;
// apply margins and what not

Kemudian Anda menangani tombol kiri mouse Anda di sini:

void rect_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
      var rect = sender as System.Windows.Shapes.Rectangle;
      // do whatever
}
person PauliusP    schedule 12.03.2014

Jika Anda memanggil kode ini saat startup aplikasi Anda, event handler akan ditambahkan secara otomatis ke semua objek baru bertipe Rectangle:

EventManager.RegisterClassHandler(typeof(Rectangle), MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(OnMouseDown), false);

private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
}
person Flat Eric    schedule 12.03.2014
comment
Hai @Flat Saya mendapatkan kesalahan di bawah ini:- Visual yang Ditentukan sudah merupakan anak dari Visual lain atau akar dari CompositionTarget. Tampak bagi saya bahwa classHandler terdaftar untuk persegi panjang pertama yang dihasilkan dan pada loop kedua ia memunculkan pengecualian ini. Persyaratan saya di sini adalah mendapatkan penangan sebanyak jumlah persegi panjang (berdasarkan data di DB). Mohon sarannya. - person Ram Murti; 13.03.2014
comment
Fungsi 'RegisterClassHandler' menambahkan handler ini ke semua Rectangle dan bukan hanya yang pertama. Kesalahan yang Anda alami biasanya terjadi saat Anda mencoba menambahkan satu kontrol ke beberapa elemen induk, misalnya jika Anda memanggil 'seatCanvas.Children.Add(rect);' beberapa kali untuk objek yang sama. - person Flat Eric; 13.03.2014
comment
Saya mendapat masalahnya sekarang. Sekarang berfungsi dengan sempurna. @Datar - person Ram Murti; 20.03.2014