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

А как на 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
xaml на C#
    #38732895
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сглючило

Код: 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
xaml на C#
    #38732971
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
xaml на C#
    #38734599
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как хочешь так и понимай
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
xaml на C#
    #38734953
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Draginsv, Открой книгу по WPF - например, Pro WPF in C# Метью МакДональда - и прочитай главу про attached propertiers. Они хранятся в том контроле для которого указано занчение в XAML - для тебя это GridSplitter. Взаимосвязь с конкретным гридом произойдет когда ты добавишь его как дочерний элемент в grid контейнер.
...
Рейтинг: 0 / 0
xaml на C#
    #38735024
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile,

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

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


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

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

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

как то так :)
...
Рейтинг: 0 / 0
xaml на C#
    #38736101
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
xaml на C#
    #38736104
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сплиттер в табитеме не обнаруживается
...
Рейтинг: 0 / 0
xaml на C#
    #38736120
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прочувствовал
Код: c#
1.
gridti.Children.Add(gsp);
...
Рейтинг: 0 / 0
xaml на C#
    #38736163
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Draginsv, можно спросить, зачем усложнять себе жизнь и задавать разметку в коде, а не в XAML-e?
...
Рейтинг: 0 / 0
xaml на C#
    #38736176
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
monstrilla,

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

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

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

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

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

Кроме того, глянь MVVM, ибо без моделей и моделей представления будешь всё ручками генерить. Это устаревший подход, и подходит, если ты работаешь один, без дизайнера и вообще любишь всё старинное. Здесь , кроме того, что базовая статья по MVVM, ещё и пример с порождением формы в табе. Здесь два примера дерева с иерархическими шаблонами данных - один пример с данными одного типа в каждом уровне дерева, другой - с данными разного типа для каждого уровня. Пробуй, комбинируй.
...
Рейтинг: 0 / 0
xaml на C#
    #38751123
НемоКэп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.
...
Рейтинг: 0 / 0
xaml на C#
    #38751124
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп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
xaml на C#
    #38751128
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а когда захочется чего-то такого-этакого, с чем шаблоны не справятся, тогда уже только смотри в кодогенерацию ГУИ.

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


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


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