powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Динамические контролы
13 сообщений из 13, страница 1 из 1
Динамические контролы
    #38621135
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!
Мне никак не удается решить вопрос об управлении динамическими контролами созданными спонтанно.
Ситуация такая.
Хочу приложение по работе с базой реализовать в одной форме.
Форма должна выглядеть как managment studio
Слева treeview
Справа tabcontrol без закладок
В treeview клик - в tabcontrol появляется закладка с заголовком, в закладка datagrid c данными из sql view
в заголовке закладки не нашел возможности создать крестик - закрытие вкладки.
При выборе из контекстного меню (новая запись, редактирование) - datagrid поджимается вверх, а снизу добавляется панель с элементами для полей таблицы и кнопками отмена или сохранить. После нажатия кнопок отправляется команда на сервер и панель с элементами для полей таблицы удаляется из коллекции элементов формы, datagrid раздвигается во всю вкладку. Если в панели с элементами в одно из полей надо вписать значение, которое надо выбрать из таблицы справочника, то добавляется новая вкладка с datagrid во всю вкладку. При этом переключение в предыдущую вкладку родителя невозможно, как будто последняя вкладка модальная. После выбора из контекстного меню "Выбрать" на соответствующей строке. Модальная вкладка с ее datagrid убирается из коллекции элементов формы и значение ключевого поля передается в соответствующее поле панели с элементами на предыдущей вкладке. И такая иерархия модальных вкладок может расти N - раз в зависимости от структуры базы данных.
Моя форма - это один класс. В ней методы. При описании в методе сценария рождения динамического контрола, сослаться на него в другом методе не получается. Если элемент на форме задан с самого начала в конструкторе, то такой проблемы нет, в любом методе можно обращаться к существующему котролу, изменяя его свойства.
Как решается данная проблема?
Заранее спасибо.
...
Рейтинг: 0 / 0
Динамические контролы
    #38621566
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DraginsvФорма должна выглядеть как managment studio
http://avalondock.codeplex.com/

Draginsvв заголовке закладки не нашел возможности создать крестик - закрытие вкладки
http://geekswithblogs.net/kobush/archive/2007/04/08/CloseableTabItem.aspx

или такой вариант http://appfx.codeplex.com/

в общем, все велосипеды изобретены до нас

в инете ещё много чего можно нарыть по заданным вопросам
...
Рейтинг: 0 / 0
Динамические контролы
    #38622386
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШайтанDraginsvв заголовке закладки не нашел возможности создать крестик - закрытие вкладки
http://geekswithblogs.net/kobush/archive/2007/04/08/CloseableTabItem.aspx

или такой вариант http://appfx.codeplex.com/
Можно даже классику почитать. ))
(Крутим вниз до картинок с закрываемыми табами.)
...
Рейтинг: 0 / 0
Динамические контролы
    #38623069
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже нашел содержательную ссылку
http://www.essentialobjects.com/doc/5/controls/tabcontrol/close_new_button.aspx
Но все описано через XAML DataTemlate.
Нашел перехват объекта формы через аргумент события типа эксперимента
Код: c#
1.
2.
3.
4.
5.
6.
        private void GotFocus(object sender, RoutedEventArgs e)
        {
            TabItem ti1 = e.Source as TabItem;
            if (ti1 !=null)
                Tab.Items.Remove(ti1);
        }



XAML, HTML еще не вклинился глубоко хотя читал HTML5, JQUERY, AJAX.
Но от кода VBA к C# как то полегче перейти.
Надоело в акцесе плодить формы и контролы, хочется универсальности типа кода-визарда.
...
Рейтинг: 0 / 0
Динамические контролы
    #38623392
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую новый класс из примера по ссылке http://www.dotnetspark.com/kb/1867-create-tab-control-wpf.aspx
Код: 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.
public class CloseableTabItem : TabItem
    {
    static CloseableTabItem()
    {
        //This style is defined in themes\generic.xaml
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem),
            new FrameworkPropertyMetadata(typeof(CloseableTabItem)));
    }
 
    public static readonly RoutedEvent CloseTabEvent =
        EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble,
            typeof(RoutedEventHandler), typeof(CloseableTabItem));
 
    public event RoutedEventHandler CloseTab
    {
        add { AddHandler(CloseTabEvent, value); }
        remove { RemoveHandler(CloseTabEvent, value); }
    }
 
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
 
        Button closeButton = base.GetTemplateChild("PART_Close") as Button;
        if (closeButton != null)
            closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click);
    }
 
    void closeButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this));
    }
    }



использую его
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            TabItem Auto = new TabItem();
            Auto.Header = "Авто";
            this.Tab.Items.Add(Auto);
            DataGrid dg1 = new DataGrid();
            BindData("Models", dg1);
            Auto.Content = dg1;

            CloseableTabItem Firm = new CloseableTabItem();
            Firm.Header = "Фирмы";
            this.Tab.Items.Add(Firm);
            DataGrid dg2 = new DataGrid();
            BindData("Firms", dg2);
            Firm.Content = dg2;
        }



у второго табитема нет заголовка.
Что не так?
...
Рейтинг: 0 / 0
Динамические контролы
    #38623419
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DraginsvПробую новый класс из примера по ссылке http://www.dotnetspark.com/kb/1867-create-tab-control-wpf.aspx
Код: 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.
public class CloseableTabItem : TabItem
    {
    static CloseableTabItem()
    {
        //This style is defined in themes\generic.xaml
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem),
            new FrameworkPropertyMetadata(typeof(CloseableTabItem)));
    }
 
    public static readonly RoutedEvent CloseTabEvent =
        EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble,
            typeof(RoutedEventHandler), typeof(CloseableTabItem));
 
    public event RoutedEventHandler CloseTab
    {
        add { AddHandler(CloseTabEvent, value); }
        remove { RemoveHandler(CloseTabEvent, value); }
    }
 
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
 
        Button closeButton = base.GetTemplateChild("PART_Close") as Button;
        if (closeButton != null)
            closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click);
    }
 
    void closeButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this));
    }
    }



использую его
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            TabItem Auto = new TabItem();
            Auto.Header = "Авто";
            this.Tab.Items.Add(Auto);
            DataGrid dg1 = new DataGrid();
            BindData("Models", dg1);
            Auto.Content = dg1;

            CloseableTabItem Firm = new CloseableTabItem();
            Firm.Header = "Фирмы";
            this.Tab.Items.Add(Firm);
            DataGrid dg2 = new DataGrid();
            BindData("Firms", dg2);
            Firm.Content = dg2;
        }



у второго табитема нет заголовка.
Что не так?
Какой-то индусский лапшекод. Я же вам норм ссылку привёл - чего вы издеваетесь над WPF?
...
Рейтинг: 0 / 0
Динамические контролы
    #38624176
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7320
это всего лишь эксперименты над объектами для осознания и визуализации результатов выражений, т.е. понять как объекты работают.
...
Рейтинг: 0 / 0
Динамические контролы
    #38624329
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Draginsvuser7320
это всего лишь эксперименты над объектами для осознания и визуализации результатов выражений, т.е. понять как объекты работают.
автору второго табитема нет заголовка.
Что-то мне кажется, что если бы вы использовали нормальные привязки, а не какую-то самописную лапшу, то заголовок бы был.
...
Рейтинг: 0 / 0
Динамические контролы
    #38624512
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не мой код, он из нета. Насчет заголовка, мне кажется это связано со стилем в xaml.
...
Рейтинг: 0 / 0
Динамические контролы
    #38624617
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот не понимаю этого задания свойств в сишарп-коде. Вы думаете, что если "динамические, созданные спонтанно", то это обязательно в коде, а не разметке? Шаблоны данных, стили и некоторые другие вещи тоже применяются "динамически" и "спонтанно", если что, а описывать их лучше всего в разметке.

Отучайтесь от Win Forms.
...
Рейтинг: 0 / 0
Динамические контролы
    #38624923
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7320
Я понял Ваш намек. Привычка вещь сильная. Надо изучать разметку. Читал тот же HTML5. Теория без практики ноль. Тоже самое и с XAML. Чтобы понять, надо опробовать, почувствовать возможности, нужно время.
...
Рейтинг: 0 / 0
Динамические контролы
    #38628669
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Накопал очень простой способ с кнопкой закрытия, но опять проблемка
Код: xml
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.
37.
      <TabControl Name="Tab" Height="250" Margin="47,425,32,-252" VerticalAlignment="Top">
            <TabControl.Resources>
                <DataTemplate x:Key="CustomTabHeader">
                    <StackPanel Orientation="Horizontal">
                        <ContentPresenter>
                            <ContentPresenter.Content>
                                <Binding Path="Header">
                                    <Binding.RelativeSource>
                                        <RelativeSource Mode="FindAncestor" 
                                                AncestorType="{x:Type TabItem}"/>
                                    </Binding.RelativeSource>
                                </Binding>
                            </ContentPresenter.Content>
                        </ContentPresenter>
                        <Button Margin="8,0,0,0" Click="CloseTab" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabItem}}}" 
                        HorizontalContentAlignment="Center" 
                        VerticalContentAlignment="Center">
                            <Grid>
                                <Canvas Width="8" Height="8">
                                    <Line X1="0" X2="8" Y1="0" Y2="8" 
                                  Stroke="Black" StrokeThickness="1"/>
                                    <Line X1="8" X2="0" Y1="0" Y2="8" 
                                  Stroke="Black" StrokeThickness="1"/>
                                </Canvas>
                            </Grid>
                        </Button>
                    </StackPanel>
                </DataTemplate>
                <Style TargetType="TabItem">
                    <Style.Setters>
                        <Setter Property="HeaderTemplate" 
                        Value="{StaticResource CustomTabHeader}"/>
                    </Style.Setters>
                </Style>
            </TabControl.Resources>
        </TabControl>
  



не могу перейти к от кнопки к tabitem с помощью sender

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void CloseTab(object sender, RoutedEventArgs e)
        {
            Control ctrl1 = e.Source as Control;


            TabItem ti1 = ......

            if (ti1 != null)
                Tab.Items.Remove(ti1);
        }



пробовал через parent выхожу на null
...
Рейтинг: 0 / 0
Динамические контролы
    #38630335
Draginsv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось решить
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        private void CloseTab(object sender, RoutedEventArgs e)
        {
            DependencyObject ctrl1 = e.Source as DependencyObject;
            DependencyObject ctrl2 = GetParentDependencyObjectFromVisualTree(ctrl1, typeof(TabItem));
            TabItem ti = ctrl2 as TabItem;
            if (ti != null)
                Tab.Items.Remove(ti);
        }

        public static DependencyObject GetParentDependencyObjectFromVisualTree(DependencyObject startObject, Type type)
        {
            DependencyObject parent = startObject;
            while (parent != null)
            {
                if (type.IsInstanceOfType(parent))
                    break;
                else
                    parent = VisualTreeHelper.GetParent(parent);
            }
            return parent;
        }


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


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