كيف أقوم بإنشاء عناصر تحكم WPF من خلال التعليمات البرمجية

StackOverflow https://stackoverflow.com/questions/7586

  •  08-06-2019
  •  | 
  •  

سؤال

كنت أحاول التعرف على XAML واعتقدت أنني سأحاول كتابة بعض التعليمات البرمجية.

محاولة إضافة شبكة تحتوي على تعريفات 6 × 6 أعمدة ثم إضافة كتلة نصية إلى إحدى خلايا الشبكة.لا يبدو أنني قادر على الإشارة إلى الخلية التي أريدها.لا توجد طريقة على الشبكة يمكنني من خلالها إضافة كتلة النص أيضًا.لا يوجد سوى Grid.children.add(object)، ولا يوجد تعريف للخلية.

XAML:

<Page x:Class="WPF_Tester.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Page1"
    Loaded="Page_Loaded">

</Page>

ج#:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    //create the structure
    Grid g = new Grid();
    g.ShowGridLines = true;
    g.Visibility = Visibility.Visible;

    //add columns
    for (int i = 0; i < 6; ++i)
    {
        ColumnDefinition cd = new ColumnDefinition();
        cd.Name = "Column" + i.ToString();

        g.ColumnDefinitions.Add(cd);
    }
    //add rows
    for (int i = 0; i < 6; ++i)
    {
        RowDefinition rd = new RowDefinition();
        rd.Name = "Row" + i.ToString();

        g.RowDefinitions.Add(rd);
    }
    TextBlock tb = new TextBlock();
    tb.Text = "Hello World";

    g.Children.Add(tb);
}

تحديث

وهنا الجزء المخيف:

  • باستخدام VS2008 Pro على XP

  • قالب مشروع WPFbrowser (تم التحقق من الإصدار 3.5)

لا أحصل على الطرق في الإكمال التلقائي.

هل كانت مفيدة؟

المحلول

يستخدم WPF شيئًا غير تقليدي يسمى الخصائص المرفقة.لذلك في XAML الخاص بك قد تكتب هذا:

<TextBlock Grid.Row="0" Grid.Column="0" />

سيؤدي هذا إلى نقل TextBlock بشكل فعال إلى الخلية (0،0) من شبكتك.

في الكود يبدو هذا غريبًا بعض الشيء.أعتقد أنه سيكون شيئًا مثل:

g.Children.Add(tb);
Grid.SetRow(tb, 0);
Grid.SetColumn(tb, 0);

ألقِ نظرة على هذا الرابط أعلاه - الخصائص المرفقة تجعل الأمور سهلة التنفيذ في XAML ربما على حساب التعليمات البرمجية ذات المظهر البديهي.

نصائح أخرى

موقع الخلية هو خاصية مرفقة - تنتمي القيمة إلى TextBlock بدلاً من Grid.ومع ذلك، نظرًا لأن الخاصية نفسها تنتمي إلى Grid، فأنت بحاجة إلى استخدام حقل تعريف الخاصية أو الوظائف الثابتة المتوفرة.

TextBlock tb = new TextBlock();
//
// Locate tb in the second row, third column.
// Row and column indices are zero-indexed, so this
// equates to row 1, column 2.
//
Grid.SetRow(tb, 1);
Grid.SetColumn(tb, 2);

استخدم الخصائص المرفقة لفئة الشبكة.

شركة#:

Grid.SetRow( cell, rownumber )

في XAML:

<TextBlock Grid.Row="1" />

وأود أيضًا أن أنصحك إذا كنت لا تستخدم الشبكات الديناميكية، فاستخدم لغة ترميز XAML.أعلم أن لديها منحنى تعليمي، ولكن بمجرد إتقانها، يصبح الأمر أسهل بكثير، خاصة إذا كنت ستستخدم ControlTemplates وDataTemplates!;)

وهنا بعض العينات

Grid grid = new Grid();

// Set the column and row definitions
grid.ColumnDefinitions.Add(new ColumnDefinition() {
     Width = new GridLength(1, GridUnitType.Auto) });
grid.ColumnDefinitions.Add(new ColumnDefinition() {
     Width = new GridLength(1, GridUnitType.Star) });
grid.RowDefinitions.Add(new RowDefinition() {
     Height = new GridLength(1, GridUnitType.Auto) });
grid.RowDefinitions.Add(new RowDefinition() {
     Height = new GridLength(1, GridUnitType.Auto) });

// Row 0
TextBlock tbFirstNameLabel = new TextBlock() { Text = "First Name: "};
TextBlock tbFirstName = new TextBlock() { Text = "John"};

grid.Children.Add(tbFirstNameLabel ); // Add to the grid
Grid.SetRow(tbFirstNameLabel , 0); // Specify row for previous grid addition
Grid.SetColumn(tbFirstNameLabel , 0); // Specity column for previous grid addition

grid.Children.Add(tbFirstName ); // Add to the grid
Grid.SetRow(tbFirstName , 0);  // Specify row for previous grid addition
Grid.SetColumn(tbFirstName , 1); // Specity column for previous grid addition

// Row 1
TextBlock tbLastNameLabel = new TextBlock() { Text = "Last Name: "};
TextBlock tbLastName = new TextBlock() { Text = "Smith"};

grid.Children.Add(tbLastNameLabel ); // Add to the grid
Grid.SetRow(tbLastNameLabel , 1);  // Specify row for previous grid addition
Grid.SetColumn(tbLastNameLabel , 0); // Specity column for previous grid addition

grid.Children.Add(tbLastName ); // Add to the grid
Grid.SetRow(tbLastName , 1);  // Specify row for previous grid addition
Grid.SetColumn(tbLastName , 1); // Specity column for previous grid addition
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top