Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / xaml на C# / 25 сообщений из 26, страница 1 из 2
29.08.2014, 16:03
    #38732888
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Добрый день!

А как на C# построить код по аналогии с xaml?

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Grid VerticalAlignment=”Stretch” HorizontalAlignment=”Stretch”>
        <Grid.RowDefinitions>
            <RowDefinition Height=”*” />
            <RowDefinition Height=”Auto” />
            <RowDefinition Height=”*” />
        </Grid.RowDefinitions>
<GridSplitter 
            Grid.Row=”1&#8243; 
            Height=”3&#8243; 
            HorizontalAlignment=”Stretch” 
            VerticalAlignment=”Center” 
            Margin=”0&#8243;/>
</Grid> 



Типа

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Grid gridti = new Grid();
RowDefinition rd1 = new RowDefinition();
rd1.Height = ???;   // <RowDefinition Height=”*” />
gridti.RowDefinitions.Add(rd1);
RowDefinition rd2 = new RowDefinition();
rd2.Height = GridLength.Auto;
gridti.RowDefinitions.Add(rd2);
RowDefinition rd3 = new RowDefinition();
rd3.Height = ???;    // <RowDefinition Height=”*” />
gridti.RowDefinitions.Add(rd3);
GridSplitter gsp = new GridSplitter();
??? // Grid.Row=”1&#8243;
gsp.Height = 3;
gsp.HorizontalAlignment = HorizontalAlignment.Stretch;
gsp.VerticalAlignment = VerticalAlignment.Center;
gsp.Margin = ???;    // Margin=”0&#8243;



Заранее спасибо!
...
Рейтинг: 0 / 0
29.08.2014, 16:07
    #38732895
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
сглючило

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Grid VerticalAlignment=”Stretch” HorizontalAlignment=”Stretch”>
        <Grid.RowDefinitions>
            <RowDefinition Height=”*” />
            <RowDefinition Height=”Auto” />
            <RowDefinition Height=”*” />
        </Grid.RowDefinitions>
<GridSplitter 
            Grid.Row=”1"; 
            Height=”3"; 
            HorizontalAlignment=”Stretch” 
            VerticalAlignment=”Center” 
            Margin=”0"/>
</Grid> 



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Grid gridti = new Grid();
RowDefinition rd1 = new RowDefinition();
rd1.Height = ???;   // <RowDefinition Height=”*” />
gridti.RowDefinitions.Add(rd1);
RowDefinition rd2 = new RowDefinition();
rd2.Height = GridLength.Auto;
gridti.RowDefinitions.Add(rd2);
RowDefinition rd3 = new RowDefinition();
rd3.Height = ???;    // <RowDefinition Height=”*” />
gridti.RowDefinitions.Add(rd3);
GridSplitter gsp = new GridSplitter();
??? // Grid.Row=”1"
gsp.Height = 3;
gsp.HorizontalAlignment = HorizontalAlignment.Stretch;
gsp.VerticalAlignment = VerticalAlignment.Center;
gsp.Margin = ???;    // Margin=”0"
...
Рейтинг: 0 / 0
29.08.2014, 17:10
    #38732971
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Grid gridti = new Grid();
RowDefinition rd1 = new RowDefinition();
rd1.Height = new GridLength(1, GridUnitType.Star); //Height="*"
gridti.RowDefinitions.Add(rd1);
RowDefinition rd2 = new RowDefinition();
rd2.Height = new GridLength(1, GridUnitType.Star); //Height="*"
gridti.RowDefinitions.Add(rd2);
RowDefinition rd3 = new RowDefinition();
rd3.Height = new GridLength(1, GridUnitType.Star); //Height="*"
gridti.RowDefinitions.Add(rd3);
GridSplitter gsp = new GridSplitter();
Grid.SetRow(gsp, 1); // Grid.Row=”1"
gsp.Height = 3;
gsp.HorizontalAlignment = HorizontalAlignment.Stretch;
gsp.VerticalAlignment = VerticalAlignment.Center;
gsp.Margin = new Thickness(0);    // Margin=”0"
...
Рейтинг: 0 / 0
02.09.2014, 09:41
    #38734599
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Как хочешь так и понимай
xaml
Код: xml
1.
<GridSplitter Grid.Row=”1"


все дела при вызове класса GridSplitter который вложен в объект Grid в разметке

c#
ни чего общего с вложенностью xaml не имеет
Код: c#
1.
Grid.SetRow(gsp, 1);


обычно я так думал: метод класса вызывают от имени к н объекта, а тут от имени класса.
я не могу понять как здесь выбирается конкретный из объектов класса Grid,
а если их будет два?
Код: c#
1.
2.
Grid gridti1 = new Grid();
Grid gridti2 = new Grid();
...
Рейтинг: 0 / 0
02.09.2014, 14:23
    #38734953
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv, Открой книгу по WPF - например, Pro WPF in C# Метью МакДональда - и прочитай главу про attached propertiers. Они хранятся в том контроле для которого указано занчение в XAML - для тебя это GridSplitter. Взаимосвязь с конкретным гридом произойдет когда ты добавишь его как дочерний элемент в grid контейнер.
...
Рейтинг: 0 / 0
02.09.2014, 15:04
    #38735024
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
bazile,

С xaml понятно, а вот с C# не понял.
Я могу на xaml грид в ячейке другого грида создать. Как c# поймет в какой грид вставить сплиттер?
...
Рейтинг: 0 / 0
03.09.2014, 11:53
    #38735980
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
когда ты добавляешь в Children Грида UIElement, тот для его размещения запросит атрибут Grid.GetRow.
Grid.Row это прикрепляемый атрибут который нужен объекту Grid размещения объектов внутри себя во время выполнения прохода
Measure
Arrange
такой прикрепляемый атрибут можно добавить к любому DependencyObject и прочитать его можно из любого класса имеющего доступ к классу который реализует этот прикрепляемый атрибут (в данном случаи это Grid)

это супер мега удобная фигня ) особенно кода нужно изменить поведение объекта (к примере)
...
Рейтинг: 0 / 0
03.09.2014, 12:29
    #38736047
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Спасибо, начинаю понимать.
xaml, template, style, binding - все это хорошо.
Но я зародился идеей создать клиента управляемого из базы данных, для этого мне придется писать практически все на c#, а это tree заполняемое из базы с рекурсией по вложенности, клик по node рождает tabitem c оригинальным содержимым по описанию из базы.
xaml я как понял - это больше статическое описание контролов на форме, а мне их нужно создавать динамически по описанию из базы.
на xaml сейчас разработана только стартовая часть приложения tree и скрытый tabcontrol, который становится видимым при появлении хотя бы одного tabitem в коллекции.
Сейчас пытаюсь на c# создавать содержимое панели tabitem, но ощущения до марафонца далеки, продвигаюсь медленно как по болоту.
Может кто меня правильно направит как правильно работать с моей идеей, только пожалуйста ее не затопчите.
...
Рейтинг: 0 / 0
03.09.2014, 12:38
    #38736062
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
для иерархического представления данных на экране в Xaml используются иерархические шаблоны:
Код: xml
1.
2.
3.
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
{тут ты декларативно описываешь, как должен выглядеть элемент дерева, для каждого элемента DataContext будет является соответствующим элементом списка}
</HierarchicalDataTemplate>


в ItemsSource ты указываешь на список ветвей текущего элемента

для удобства стоит создать базовую модель представления для всех элементов дерева, создать в ней 2 поля:
IsExpand
IsSelect и биндить их к полям элемента TreeViewItem (если контейнером выступает именно этот объект (при услосвии, что ты используешь TreeView контрол)

Что тебе это даст? ты можешь загружать дерево последовательно, к примеру в сеттере IsExpand, если новое значение равно True, будут загружаться из твоего плоского списка все элементы которые имеют нужный атрибут "родитель"
а с помощью свойства IsSelect ты всегда сможешь через ModelView задать текущий выбранный элемент.

как то так :)
...
Рейтинг: 0 / 0
03.09.2014, 13:09
    #38736101
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Roman Mejtes , спасибо!

Я решил вопрос с заполнением дерева с помощью c#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
private void fillTree()
        {
            DataTable dt=selectData("select * from sTreeMenu where IdParent IS NULL");
            foreach (DataRow dr in dt.Rows)
            {
                TreeViewItem tvi = new TreeViewItem();
                tvi.Tag = dr[0];
                tvi.Header = dr[2].ToString();
                TreeMenu.Items.Add(tvi);
                fillTreeChild((Int32)dr[0], tvi);
                tvi.IsExpanded = true;
            }
        }

        private void fillTreeChild(Int32 idParent, TreeViewItem tvi)
        {
            DataTable dt = selectData("select * from sTreeMenu where IdParent = " + idParent.ToString() + " order by id");
            foreach (DataRow dr in dt.Rows)
            {
                TreeViewItem tvic = new TreeViewItem();
                tvic.Tag = dr[0];
                tvic.Header = dr[2].ToString();
                tvi.Items.Add(tvic);
                fillTreeChild((Int32)dr[0], tvic);
                tvi.IsExpanded = true;
            }
        }



сейчас никак не могу заставить появиться содержимому табитема
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
        private void SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (TreeMenu.SelectedItem != null)
            {
                TreeViewItem tvi = (TreeViewItem)this.TreeMenu.SelectedItem;
                this.TabControl.Visibility = Visibility.Visible;
                TabItem ti = new TabItem();
                ti.Name = "ti" + tvi.Tag.ToString();
                ti.Header = tvi.Header;

                Grid gridti = new Grid();
                RowDefinition rd1 = new RowDefinition();
                rd1.Height = new GridLength(1, GridUnitType.Star);
                gridti.RowDefinitions.Add(rd1);
                RowDefinition rd2 = new RowDefinition();
                rd2.Height = GridLength.Auto;
                gridti.RowDefinitions.Add(rd2);
                RowDefinition rd3 = new RowDefinition();
                rd3.Height = new GridLength(1, GridUnitType.Star);
                gridti.RowDefinitions.Add(rd3);
                GridSplitter gsp = new GridSplitter();
                Grid.SetRow(gsp, 1);
                gsp.Background = new SolidColorBrush(Colors.Red);
                gsp.Height = 3;
                gsp.HorizontalAlignment = HorizontalAlignment.Stretch;
                gsp.VerticalAlignment = VerticalAlignment.Center;
                gsp.Margin = new Thickness(2);
                ti.Content = gridti;
                lTabItem.Add(ti);
                this.TabControl.Items.Add(ti);
                this.TabControl.SelectedItem = ti;
                //this.TreeMenu.IsEnabled = false;
                statusBar = this.StatusBar.Text;
                this.StatusBar.Text = "Панель " + ti.Header + " открыта.";
            }
        }


ti.Content = gridti; как будто не работает или я не так делаю.
...
Рейтинг: 0 / 0
03.09.2014, 13:12
    #38736104
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
сплиттер в табитеме не обнаруживается
...
Рейтинг: 0 / 0
03.09.2014, 13:25
    #38736120
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Прочувствовал
Код: c#
1.
gridti.Children.Add(gsp);
...
Рейтинг: 0 / 0
03.09.2014, 13:49
    #38736163
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv, можно спросить, зачем усложнять себе жизнь и задавать разметку в коде, а не в XAML-e?
...
Рейтинг: 0 / 0
03.09.2014, 13:57
    #38736176
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
monstrilla,

Я не нашел решения как генерить разметку по содержанию базы.
...
Рейтинг: 0 / 0
03.09.2014, 14:01
    #38736184
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
я представления не имею об содержимом табитемов, об этом знаю служебные таблицы базы данных.
какие там контролы с какой привязкой бог его знает.
...
Рейтинг: 0 / 0
03.09.2014, 14:15
    #38736212
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv, может просто использовать не Grid, а DataGrid, если проблема только в динамическом количестве строк?

так или иначе, можно строку (в формате XAML) конвертить в собственно XAML. Есть такой тип в ВФП XamlReader.
Это почти то же самое, что делаешь ты, но на мой взгляд XAML собирать удобнее, чем в объекты в кодбехайнде
...
Рейтинг: 0 / 0
03.09.2014, 14:17
    #38736213
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv, авторкакие там контролы

а, ну если контролы в окне динамические, то понятно
...
Рейтинг: 0 / 0
03.09.2014, 14:34
    #38736239
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
у датагрида автогенерация столбцов для табличного просмотра и навигации то что надо.
А вот контрола с авто генерацией лейбов и текстбоксов по вертикали в контейнере для одной строки таблицы базы я не нашел.
...
Рейтинг: 0 / 0
03.09.2014, 14:37
    #38736245
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Draginsv, опиши задачу в целом, т.е. что ты выводишь, что хочешь увидеть в результате.
...
Рейтинг: 0 / 0
03.09.2014, 15:15
    #38736333
Draginsv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
В целом
окно типа проводника
слева дерево типа меню
справа появляющийся табконтрол
клик по ноду дерева-родился табитем
по тегу дерева из базы берется служебная инфа
в табе генерятся элементы - форма готова
пока такая идея формы
верх текст блок с отображением примененного фильтра к табличной части
табличная часть
сплиттер
детальная часть - лейбы и текстбоксы - применяется для редактирования и фильтрации.
один из техтбоксов может быть по полю таблицы ссылкой на примерикей другой таблицы, но в нем отображается строка таблицы родителя а не ключ. Соответсвенно будет использоваться подстановки ключа из выбранной строки вновь рожденного табитема
с динамическими контролами и с подобным видом и тд пока не будет ссылок на ключи в детальной части.
При этом поведение табитемов "Модальное" как с модальными формами.
Это функционал редактирования базы.
Также будут инструментальные табы для макроопераций со своим обобщенным видом.
это только начало.
...
Рейтинг: 0 / 0
19.09.2014, 07:26
    #38751121
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
DraginsvRoman Mejtes , спасибо!

Я решил вопрос с заполнением дерева с помощью c#
Тебе правильно указали на шаблоны данных. Не знаю, может, для всех твоих хотелок шаблонов и не хватит, но для некоторых - точно хватит.

DraginsvВ целом
окно типа проводника
слева дерево типа меню
справа появляющийся табконтрол
клик по ноду дерева-родился табитем
по тегу дерева из базы берется служебная инфа
в табе генерятся элементы - форма готова
пока такая идея формы
Это на башлонах данных всё решается.

Кроме того, глянь MVVM, ибо без моделей и моделей представления будешь всё ручками генерить. Это устаревший подход, и подходит, если ты работаешь один, без дизайнера и вообще любишь всё старинное. Здесь , кроме того, что базовая статья по MVVM, ещё и пример с порождением формы в табе. Здесь два примера дерева с иерархическими шаблонами данных - один пример с данными одного типа в каждом уровне дерева, другой - с данными разного типа для каждого уровня. Пробуй, комбинируй.
...
Рейтинг: 0 / 0
19.09.2014, 07:29
    #38751123
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Вот правильная цитата к твоему подходу:

авторThe problem is that people often try to use it in the same way that one might code against the Windows Forms TreeView control. In order to leverage the extensive features of the WPF TreeView, you cannot use the same programming techniques as in Windows Forms. This is yet another example of how WPF requires you to shift mental gears to make use of the platform appropriately. We aren’t in Kansas anymore, Toto.
...
Рейтинг: 0 / 0
19.09.2014, 07:30
    #38751124
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
НемоКэп42Вот правильная цитата к твоему подходу:

авторThe problem is that people often try to use it in the same way that one might code against the Windows Forms TreeView control. In order to leverage the extensive features of the WPF TreeView, you cannot use the same programming techniques as in Windows Forms. This is yet another example of how WPF requires you to shift mental gears to make use of the platform appropriately. We aren’t in Kansas anymore, Toto.
...если абстрагироваться от TreeView.
...
Рейтинг: 0 / 0
19.09.2014, 07:34
    #38751128
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
Ну, а когда захочется чего-то такого-этакого, с чем шаблоны не справятся, тогда уже только смотри в кодогенерацию ГУИ.

Есть ещё такой изврат.
...
Рейтинг: 0 / 0
19.09.2014, 13:12
    #38751464
monstrilla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xaml на C#
авторКроме того, глянь MVVM, ибо без моделей и моделей представления будешь всё ручками генерить. Это устаревший подход, и подходит, если ты работаешь один, без дизайнера и вообще любишь всё старинное.


мввм он как бы про другое и нет никакого "устаревшего" подхода. каждый подход хорош к месту :)
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / xaml на C# / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]