Как в C # (или в C # с WPF) построить флажок во время выполнения? - PullRequest
1 голос
/ 27 июня 2010

В C # (или в C # с WPF), как мне создать флажок во время выполнения? Я смогу запросить флажок, чтобы увидеть, нажал ли пользователь на него?

Другими словами, предположим, у меня есть «сетка», на которой я хочу, чтобы отображались некоторые флажки. Но я не знаю, сколько флажков для отображения. Я полагаю, что мог (в WPF) заполнить сетку флажками во время разработки и пометить их как скрытые (или явно == false), а затем показать их во время выполнения. Но я надеялся, что есть более элегантный способ сделать это.

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Есть несколько способов сделать это в WPF. Быстрый и грязный подход состоит в том, чтобы сделать что-то вроде этого:

<StackPanel x:Name="CheckBoxes" />

Затем в вашем коде выполните:

for (int i=0; i < 10; i++) {
    this.CheckBoxes.Children.Add(new CheckBox());
}

Но, на первый взгляд, это выглядит просто, но в долгосрочной перспективе от этого трудно работать. Вместо этого лучшим решением было бы иметь класс с логическим свойством, таким как:

// this should really implement INotifyPropertyChanged but
// we'll ignore that for now...
public class SelectableThing {

    public bool IsSelected {
        get;
        set;
    }

    public string Description {
        get;
        set;
    }

}

Тогда в вашем XAML у вас будет привязываемый элемент управления, например ItemsControl:

<ItemsControl x:Name="CheckBoxes">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"
                      Content="{Binding Description}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Затем в своем коде вы можете создать коллекцию этих SelectableThing и установить их в качестве ItemsSource.

private SelectableThing[] things;

// where you do this is up to you really
private void Window_Load(object sender, RoutedEventArgs e) {

    things = new SelectableThing[] {
        new SelectableThing("First Thing"),
        new SelectableThing("Second Thing"),
        new SelectableThing("Third Thing")
    };

    CheckBoxes.ItemsSource = things;

}
0 голосов
/ 27 июня 2010

В обработчике событий или что-то в этом роде, в конце концов, вызывается метод, вы можете сделать это. Допустим, ваш холст называется myCanvas.

var cb = new CheckBox { //... set the properties, e.g.:
                             Checked = true, Content = "Check me" };
// do whatever you like to do with your newly created CheckBox
myCanvas.Children.Add(cb);

Надеюсь, это поможет; Конечно, вы можете сделать это внутри цикла. Если вам нужно хранить определенный набор ссылок на созданные CheckBox, знайте об этом или используйте свойство Tag для идентификации этих специальных CheckBox. Кроме того, вы можете проверить myCanvas.Children для CheckBoxes.

...