Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод списка юзерконтролов 
:(
    Опции темы
klein
Дата 20.4.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Привет всем.
1. Возможно ли запихнуть в listbox/listview свой wpf user control ?
2. Есть ли способ подключить и вывести на форму n-ное количество контролов для работы с ними ?
PM MAIL   Вверх
SergeyLoginov
Дата 20.4.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



1. Да.
2. Да.
Для этого существует свойство ItemTemplate.
PM MAIL   Вверх
klein
Дата 21.4.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Спасибо за оперативный ответ. Но я чтото не могу разобраться, все примеры на XAML. Если Вам не трудно приведите пожалуйста пример на C#. С XAML я покачто не сдружился.
PM MAIL   Вверх
SergeyLoginov
Дата 21.4.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



Надо дружиться. Потому что такие вещи как описание шаблона производятся именно в XAML. В C# это сделать можно, но не нужно.
PM MAIL   Вверх
klein
Дата 21.4.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Ну какже не нужно ? Если логика програмы решает сколько добавлять контролов. В XAML насколько я знаю это какраз и не нужно делать. 
Про шаблоны я согласен. Неужели нужно создавать XAML "представление" контрола для добавление в listbox ?
Перефразирую вопрос. Как на C# можно сделать чтото типа такого ?
Код

//Внимание код нерабочий, не копипастить
for (int i = 0; i<n; i++ )
{
    listbox1.Items.Add(new label(i));
}


 
PM MAIL   Вверх
klein
Дата 21.4.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Все намного проще  smile 
Код

stackPanel1.Children.Add(UserControl);

PM MAIL   Вверх
SergeyLoginov
Дата 21.4.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.9.2009
Где: Иваново

Репутация: 4
Всего: 4



Цитата(klein @ 21.4.2011,  13:34)
Ну какже не нужно ? Если логика програмы решает сколько добавлять контролов. В XAML насколько я знаю это какраз и не нужно делать. 
Про шаблоны я согласен. Неужели нужно создавать XAML "представление" контрола для добавление в listbox ?

Почитай про MVVM патерн, посмотри примерчики. Найдешь ответы на все свои вопросы. 
Код

stackPanel1.Children.Add(UserControl);

 - это ужасно. Уверен, что в твоем случае делать так крайне не рекомендуется. 
Чтобы не быть голословным, продемонстрирую простенький пример того, как можно сделать (это не MVVM). Пример кривой, шлефовать его времени нет, но смысл передан:
Файл MainWindow.xaml
Код

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MyWindow" Height="350" Width="400"
        Name="MyWindow">
    <DockPanel>
        <Button Content="Add new item" DockPanel.Dock="Bottom" HorizontalAlignment="Left" Margin="5" Click="Button_Click" />
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <ListView DataContext="{Binding ., ElementName=MyWindow}" ItemsSource="{Binding MyItems}"                  
                      HorizontalContentAlignment="Stretch">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="0.3*"/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="{Binding Name}" Grid.Column="0"/>
                            <TextBox Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1"/>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <ListBox DataContext="{Binding ., ElementName=MyWindow}" ItemsSource="{Binding MyItems}"                  
                      HorizontalContentAlignment="Stretch"
                      Grid.Column="1">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="Имя: "/>
                                <TextBlock Text="{Binding Name}"/>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="Описание: "/>
                                <TextBox Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}"/>
                            </StackPanel>                            
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>        
    </DockPanel>
</Window>

Файл MainWindow.xaml.cs
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MyItems.Add(new MyData("item1", "description1"));
            MyItems.Add(new MyData("item2", "description2"));
            MyItems.Add(new MyData("item3", "description3"));
        }

        ObservableCollection<MyData> myItems = new ObservableCollection<MyData>();

        /// <summary>
        /// Список данных
        /// </summary>
        public ObservableCollection<MyData> MyItems
        {
            get { return myItems; }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MyItems.Add(new MyData("new item", "new item description"));
        }
    }

    /// <summary>
    /// Класс данных
    /// </summary>
    public class MyData : INotifyPropertyChanged
    {
        public MyData(string name, string description)
        {
            if (string.IsNullOrEmpty(name))
                throw new ArgumentException("Name must be not empty!");
            Name = name;
            Description = description;
        }

        private string name = string.Empty;

        public string Name
        {
            get { return name; }
            private set 
            { 
                name = value;
                OnPropertyChanged("Name");
            }
        }

        private string description = string.Empty;

        public string Description
        {
            get { return description; }
            set
            {
                description = value;
                OnPropertyChanged("Description");
            }
        }

        #region INotifyPropertyChanged

        /// <summary>
        /// Событие на изменение свойства
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Уведомление об изменении свойства (все объекты представления привязаные к этому свойству автоматически обновят себя)
        /// </summary>
        /// <param name="propertyName">Имя свойства принимающего новое значение</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}



Добавлено через 2 минуты и 32 секунды
На будущее. Старайся избегать создания и изменения визуальных элементов в коде. Это может быть оправдано в очень редких случаях. 
PM MAIL   Вверх
klein
Дата 22.4.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Спасибо за заданое направление. На выходных плотно займусь разбором. 
Наверное моя задача оправдывает такой метод. Руководствовался тем что заранее не знаю сколько будет нужно каких контролов, + гибкость при будущих модификациях в сравнении з статически заданым ГУИ. 

Но и за этот пример спасибо, думаю в будущем пригодится.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1063 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.