Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
Вопрос простой и он был задан в заголовке. Далее что меня сподвигло его задать:

Возьмём тот же гридпанель - создал четыре строки и три столбца. В них начал помещать компоненты.

Наклепал интефрейс, всё тщательно расписал в xaml, у каждого компонента указал Grid.Row, Grid.Column, Grid.ColumnSpan, Grid.RowSpan
Потом бац! И понадобилось ввести ещё одну строку RowDefinition с индексом 0 в этой гридпанели. Во всех компонентах каждый раз переписывать Grid.Row? А столбец с индексом 1 - это мне переписывать свойства Column и ColumnSpan во всех компонентах?

Я напомню, что речь идёт о большой программе. Как правильно проектировать её интерфейс, чтоб не запутаться?

А как решать проблему с невидимыми панелями? - ну, теми, которые пока что visible == hidden, которые должны отобразиться по ходу работы пользователя с программой в нужный момент? Насколько правильно я делаю, протыкивая многим "лишним" (мешающим) существующим компонентам visible = hidden (временно), чтобы правильно разместить новую панельку. А потом, когда я удовлетворён её размещением, её скрываю, и пробегаюсь по другим, делаю visible = true обратно на всех тех, что должны быть видны с самого начала.
Короче, беготня по компонентам с целью изменить их свойство visible сначала в false, потом обратно в true при каждом новом добавлении (или изменении существующих) компонент мне немного поднадоела.

P.S.
p.s.
под "панелями" я имею в виду любые компоненты. Просто называю их так потому что всякого рода textbox и т.п. я помещаю не непосредственно на MainForm, а создаю свои компоненты и пихаю их туда, чтобы логика этих компонент была внутри них. И каждый мой компонент представляет собой такую "панель" - либо с кнопками, либо там ещё с чем-нибудь... А есть некоторые "панели", которые предоставляют кнопочки для скрытия или открытия других панелей. Как-то так.
30 авг 16, 00:41    [19605439]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
В тексте выше под словом "visible" имеется в виду Visibility, а под словом hidden - collapsed.
С непривычки перепутал.


Вот, в userform я такой проблемы не испытывал, т.к. там все невидимые компоненты во время разработки отображаются на экране, а не скрываются.
30 авг 16, 00:45    [19605441]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
да блин
userform - в смысле, winforms.
Надо проспаться
30 авг 16, 00:45    [19605442]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
есть еще UniformGrid, в нём не нужно использовать Grid.Row
Ну и если сильно припёрло, напишите свою панель так, как вы её видите, в этом проблемы нет.

написал уже не 1 проект, обычно работаю так:
мне приносят макеты интефейса
по макетам я делаю 1 наброски, на этом этапе как раз и задаются все гриды
весь интерфейс я пишу в DataTemplate'ах, а не UserControl'а
потом уже дорабатываю "помакетно"
Не понял, зачем вы задаете Visbility при добавлении нового объекта.
Если интерфейс предполагает наличии нескольких объектов 1 типа на панели, можно использовать ItemsControl, а в нём реализовать всю логику с Visibility.
К сожалению, когда нужна сложная логика работы приходится писать контролы ручками
30 авг 16, 07:20    [19605545]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Charles Weyland
Наклепал интефрейс, всё тщательно расписал в xaml, у каждого компонента указал Grid.Row, Grid.Column, Grid.ColumnSpan, Grid.RowSpan
Потом бац! И понадобилось ввести ещё одну строку RowDefinition с индексом 0 в этой гридпанели. Во всех компонентах каждый раз переписывать Grid.Row? А столбец с индексом 1 - это мне переписывать свойства Column и ColumnSpan во всех компонентах?
+1

Больной на голову автор WPF-ной панели Grid видимо не был знаком с HTML. У нас для решения этой проблемы был написан следующий костыль:
+ Костыль для Grid
    public class AutoGrid : Grid
    {
        #region Execute Mapping Events

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            RecomputeGridMapping();
        }

        protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
        {
            base.OnVisualChildrenChanged(visualAdded, visualRemoved);

            if (IsInitialized)
                RecomputeGridMappingOnce();
        }

        void Columns_Changed(DependencyPropertyChangedEventArgs e)
        {
            if (IsInitialized)
                RecomputeGridMappingOnce();
        }

        #endregion

        #region Mapping Core

        DispatcherOnceInvoker RecomputeGridMappingOnceInvoker = new DispatcherOnceInvoker();

        void RecomputeGridMappingOnce()
        {
            RecomputeGridMappingOnceInvoker.BeginInvokeOnce(RecomputeGridMapping);
        }

        void RecomputeGridMapping()
        {
            CreateRows();
            CreateColumns();
            MapChildren();
        }

        void CreateRows()
        {
            var rows = Children.Count / Columns;

            if (Children.Count % Columns > 0)
                rows++;

            while (RowDefinitions.Count > rows && RemoveLastAutoGeneratedItem(RowDefinitions))
            { }

            while (RowDefinitions.Count < rows)
            {
                var row = new RowDefinition { Height = GridLength.Auto };
                SetIsAutoGenerated(row, true);
                RowDefinitions.Add(row);
            }
        }

        void CreateColumns()
        {
            while (ColumnDefinitions.Count > Columns && RemoveLastAutoGeneratedItem(ColumnDefinitions))
            { }

            while (ColumnDefinitions.Count < Columns)
            {
                var column = new ColumnDefinition { Width = GridLength.Auto };
                SetIsAutoGenerated(column, true);
                ColumnDefinitions.Add(column);
            }

            if (ColumnDefinitions.Count > 0)
            {
                var lastColumn = ColumnDefinitions[ColumnDefinitions.Count - 1];
                if (GetIsAutoGenerated(lastColumn))
                    lastColumn.ClearValue(ColumnDefinition.WidthProperty);
            }
        }

        bool RemoveLastAutoGeneratedItem<T>(IList<T> list)
            where T : DependencyObject
        {
            var index = list.LastIndex(v => GetIsAutoGenerated(v));
            if (index >= 0)
            {
                list.RemoveAt(index);
                return true;
            }
            return false;
        }

        void MapChildren()
        {
            int i = 0;
            foreach (UIElement child in Children)
            {
                SetColumn(child, i % Columns);
                SetRow(child, i / Columns);
                i++;
            }
        }

        #endregion

        #region Columns Property

        public static readonly DependencyProperty ColumnsProperty =
            DependencyProperty.Register(
                "Columns",
                typeof(int),
                typeof(AutoGrid),
                new FrameworkPropertyMetadata(2, (s, e) => ((AutoGrid)s).Columns_Changed(e))
            );

        public int Columns
        {
            get { return (int)GetValue(ColumnsProperty); }
            set { SetValue(ColumnsProperty, value); }
        }

        #endregion

        #region IsAutoGenerated Property

        static readonly DependencyProperty IsAutoGeneratedProperty =
            DependencyProperty.RegisterAttached(
                "IsAutoGenerated",
                typeof(bool),
                typeof(AutoGrid)
            );

        static bool GetIsAutoGenerated(DependencyObject target)
        {
            return (bool)target.GetValue(IsAutoGeneratedProperty);
        }

        static void SetIsAutoGenerated(DependencyObject target, bool value)
        {
            target.SetValue(IsAutoGeneratedProperty, value);
        }

        #endregion
    }

    public class DispatcherOnceInvoker : DispatcherObject
    {
        Action Action;

        public void BeginInvokeOnce(Action action)
        {
            VerifyAccess();

            if (Action != null)
                return;

            Action = action;

            Dispatcher.BeginInvoke(() =>
            {
                var actionToExecute = GetActionAndReset();
                actionToExecute();
            });
        }

        Action GetActionAndReset()
        {
            var result = Action;
            Action = null;
            return result;
        }
    }
Там идея в авторасстановке свойств Grid.Row и Grid.Col в зависимости от количества колонок в свойстве Columns.
30 авг 16, 08:46    [19605688]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Roman Mejtes
Ну и если сильно припёрло, напишите свою панель так, как вы её видите, в этом проблемы нет.
Ну и сколько человекочасов ожидается потратить на написание аналога <table> + <tr> + <td> под WPF? Заняться-то больше нечем.
30 авг 16, 08:48    [19605691]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
Алексей К
Больной на голову автор WPF-ной панели Grid видимо не был знаком с HTML

Знаком. Есть там table - и заполняются там ячейки в момент их создания. А тут сначала кучу создал, потом по номерам обратился. И чем по-твоему это мне должно помочь? В том-то и дело, что если б работало как в html, я был бы счастлив!


Если б сделали хотя бы доступ не по номерам, а по названиям колонок.
Типа,
Grid.Column ="colName" Grid.ColumnSpanTo="colSurname"
Было бы зашибись.
Сделал бы так, если б умел. Я пока только осваиваюсь в wpf, в связи с чем вопросы и задаю.
30 авг 16, 09:25    [19605781]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
А программулину, что ты скинул, вечером потестирую, как домой приеду...
30 авг 16, 09:26    [19605784]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Charles Weyland
Алексей К
Больной на голову автор WPF-ной панели Grid видимо не был знаком с HTML

Знаком. Есть там table - и заполняются там ячейки в момент их создания.
Ты один из авторов WPF? Это послание было обращено автору WPF Grid.
Charles Weyland
А тут сначала кучу создал, потом по номерам обратился. И чем по-твоему это мне должно помочь? В том-то и дело, что если б работало как в html, я был бы счастлив!
Ниже реальный пример использования, Grid.Row и Grid.Col рассчитываются автоматически.
+ Реальный пример формы редактирования.
<UserControl x:Class="Personal.FrmPersonalEdit"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:s="clr-namespace:SspMain;assembly=SspMainWpf"
             xmlns:my="clr-namespace:Personal"
             mc:Ignorable="d" 
             Width="400">
    <s:AutoGrid DataContext="{Binding Data}">
        <TextBlock Margin="3" VerticalAlignment="Center" Text="Фамилия:"/>
        <TextBox Margin="3" HorizontalAlignment="Left" MinWidth="200">
            <TextBox.Text>
                <Binding Path="LastName" Converter="{my:CnvPersNamePart}">
                    <Binding.ValidationRules>
                        <s:NotNullRule/>
                        <my:PersNamePartRule/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

        <TextBlock Margin="3" VerticalAlignment="Center" Text="Имя:"/>
        <TextBox Margin="3" HorizontalAlignment="Left" MinWidth="200">
            <TextBox.Text>
                <Binding Path="FirstName" Converter="{my:CnvPersNamePart}">
                    <Binding.ValidationRules>
                        <s:NotNullRule/>
                        <my:PersNamePartRule/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

        <TextBlock Margin="3" VerticalAlignment="Center" Text="Отчество:"/>
        <TextBox Margin="3" HorizontalAlignment="Left" MinWidth="200">
            <Binding Path="PatrName" Converter="{my:CnvPersNamePart}">
                <Binding.ValidationRules>
                    <s:NotNullRule/>
                    <my:PersNamePartRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox>

        <TextBlock Margin="3" VerticalAlignment="Center" Text="Табельный номер:"/>
        <TextBox Margin="3,3,0,3" MinWidth="80" HorizontalAlignment="Left">
            <TextBox.Text>
                <Binding Path="TabNum" Converter="{s:CnvInt}">
                    <Binding.ValidationRules>
                        <s:NotNullRule/>
                        <s:IntBetweenRule MinValue="1"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

        <TextBlock Text="Дата поступления:" VerticalAlignment="Center" Margin="3"/>
        <s:DateTimePicker Value="{Binding EntranceDate}" FormatMode="Date" Margin="3"/>

        <TextBlock Text="Дата увольнения:" VerticalAlignment="Center" Margin="3"/>
        <s:DateTimePicker Value="{Binding RetireDate}" FormatMode="Date" Margin="3"/>

        <TextBlock Text="Примечания:" VerticalAlignment="Top" Margin="3"/>
        <TextBox Margin="3" 
                 Text="{Binding Notes}" 
                 Style="{StaticResource NotesTextBoxStyle}"/>
    </s:AutoGrid>
</UserControl>
30 авг 16, 09:33    [19605803]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
Алексей К ,

а, я в электричке читал, не увидел слова "автор".

За пример большое спасибо!! Попробую обязательно
30 авг 16, 10:17    [19606020]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Ok :-)
30 авг 16, 10:20    [19606040]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
а можно глянуть скриншот, чтобы знать, что ожидать?
30 авг 16, 10:22    [19606052]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
.

К сообщению приложен файл. Размер - 7Kb
30 авг 16, 10:25    [19606070]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21984
Charles Weyland
Потом бац! И понадобилось ввести ещё одну строку RowDefinition с индексом 0 в этой гридпанели.
Часто использование DockPanel оправданнее и удобнее грида. Присмотрись к ней.
30 авг 16, 10:30    [19606094]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
Да, где возможно, заменяю именно док-панелью.
Кстати, у неё какой-то "глюк" есть.
Создаю на ней две кнопки фиксированной ширины. Одну док=влево, другую док=вправо.
Вторая располагается по середине. И ничего с ней не сделать.
Пока дополнительно не создашь какой-нибудь <GridPanel />.
Т.е. пока нет элемента, который заполнит собой всю оставшуюся область, размещённые на док-панели компоненты будут располагаться не там, где им полагается быть. Для меня это странно.
30 авг 16, 10:35    [19606133]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
UniForm грид еще удобен для размещения кнопок, если Grid не растянут, а выравнен по краю, то его размер будет равен максимальному размеру 1 из содержимого * на количество клеток\строк. То есть все кнопки (например) будут 1 размера

автор
Больной на голову автор WPF-ной панели Grid видимо не был знаком с HTML. У нас для решения этой проблемы был написан следующий костыль
тут просто несколько разные подходы. для того, о чём вы пишите есть FlowDocument, где можно создать и таблицу в том числе, а в таблице разместить нужные элементы управления.
30 авг 16, 10:51    [19606228]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21984
Charles Weyland
Вторая располагается по середине.
самой кнопке задай выравнивание вправо
30 авг 16, 10:54    [19606246]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
а, действительно. Хм.
Хотя это тоже странно. Не понятно, чем объясняется свободное пространство правее кнопки.
30 авг 16, 11:04    [19606306]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
...хотя понял...
две кнопки делят между собой панель пополам. И по умолчанию выравнивание идёт по левому краю. А раз я задал фиксированную ширину, то справа появилось свободное место.

Спасибо)
30 авг 16, 11:06    [19606314]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Roman Mejtes
автор
Больной на голову автор WPF-ной панели Grid видимо не был знаком с HTML. У нас для решения этой проблемы был написан следующий костыль
тут просто несколько разные подходы. для того, о чём вы пишите есть FlowDocument, где можно создать и таблицу в том числе, а в таблице разместить нужные элементы управления.
FlowDocument вроде как используется в основном для создания отчётности? Побочных эффектов в нём нет от встраивания в него "обычных" контролов? На первый взгляд вроде работает, но есть масса сомнений.
+
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <my:Class1/>
    </Window.DataContext>
    <FlowDocumentScrollViewer>
        <FlowDocument>
            <Table>
                <TableRowGroup>
                    <TableRow>
                        <TableCell>
                            <Paragraph>Value1:</Paragraph>
                        </TableCell>
                        <TableCell>
                            <Paragraph>
                                <TextBox Width="200" Text="{Binding Value1}"/>
                            </Paragraph>
                        </TableCell>
                    </TableRow>
                    <TableRow>
                        <TableCell>
                            <Paragraph>Value2:</Paragraph>
                        </TableCell>
                        <TableCell>
                            <Paragraph>
                                <TextBox Width="200" Text="{Binding Value2}"/>
                            </Paragraph>
                        </TableCell>
                    </TableRow>
                </TableRowGroup>
            </Table>
        </FlowDocument>
    </FlowDocumentScrollViewer>
</Window>
Понятно, что подход с Grid панель другой. Непонятно зачем он был предложен, когда есть более удобные альтернативы.
30 авг 16, 11:15    [19606381]     Ответить | Цитировать Сообщить модератору
 Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4350
Алексей К
Понятно, что подход с Grid панель другой. Непонятно зачем он был предложен, когда есть более удобные альтернативы.

Может, ради RowSpan и ColumnSpan? Я использую GridPanel по двум причинам:
1. равномерное растяжение всего содержимого
2. возможность вольного добавления элементов управления -
  • одного в ячейке 1x1 (строка x столбец),
  • другого чуть ниже, в ячейке 2x1,
  • третьего в объединённой ячейке 1x1 ... 2x1,
  • А четвёртого в объединённой ячейке вообще справа - 1x1 ... 1x3
    Это, в частности, нужно для оформительских элементов управления (линий там.. ), фоновых логотипах. Но не только.
  • 30 авг 16, 11:35    [19606517]     Ответить | Цитировать Сообщить модератору
     Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
    Roman Mejtes
    Member

    Откуда: г. Пермь
    Сообщений: 4036
    кстати есть еще один изощренный способ про который не упоминают, обычно:

    это Grid.IsSharedSizeScope="True", DefinitionBase.SharedSizeGroup="GroupName"
            <StackPanel Grid.IsSharedSizeScope="True">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="LabelText"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="Name"/>
                    <TextBox Grid.Column="1" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="LabelText"/>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="Age" />
                    <TextBox Grid.Column="1" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="LabelText"/>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="Telephone"/>
                    <TextBox Grid.Column="1"/>
                </Grid>
            </StackPanel>
    
    30 авг 16, 12:24    [19606829]     Ответить | Цитировать Сообщить модератору
     Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4350
    А это вообще нормально, что XAML файл разрастается до нескольких тысяч строк? И, по ходу, с такими темпами за десятку уйдёт
    30 авг 16, 13:25    [19607174]     Ответить | Цитировать Сообщить модератору
     Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4350
    я как-то привык к маленьким файлам. Если разрастается, то разделяю по разным файлам или даже проектам. И один файлик от 10 до 500 строк кода C# обычно.
    30 авг 16, 13:26    [19607181]     Ответить | Цитировать Сообщить модератору
     Re: Как на WPF создаёте сложные интерфейсы? (рассуждения, опыт)  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21984
    А зачем ты его разращиваешь? Что мешает инкапсулировать даже неповторяющийся код?
    30 авг 16, 13:28    [19607190]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / WPF, Silverlight Ответить