Re[2]: C# vs. XAML
От: Codechanger Россия  
Дата: 23.09.09 12:31
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Вообще, если по-честному сказать, сомневаюсь, что дизайнер (тот, который настоящий дизайнер, а не «веб-дизайнер») сможет редактировать XAML без глубокой специальной подготовки.

XAML не сложнее HTML.
А>Ведь XAML — это, в принципе, тоже язык программирования, может быть, слегка более абстрактный, чем C#. Он всего лишь является способом доступа к объектной модели через XML.
Флейм по этому поводу разводить не буду
А>А объектная модель — это удел программистов. Для человека, далекого от программирования, все объектные модели будут такой же китайской грамотой, как и все программирование в целом.
Не путайте объектную модель с отображением. Это две разных вещи.
А>Мне кажется, на XAML нереально написать что-то серьезное, не понимая, как он внутри работает, а чтобы это понимать, нужно быть программистом.
Неверное утверждение. Дизайнер в XAML пишет внешний вид, все остальное на откуп программисту(биндинги и пр.). XAML — язык для верстки.
А>Кстати, знаменательно, что в какой-то газете я прочитал неграмотное замечание о том, что XML — это язык программирования. И какая-то доля правды в этом есть.
А>Так что идея о том, что дизайнер может напрямую редактировать XAML, мне кажется наивной.
А>Дизайнер сможет работать с визуальным интерактивным редактором, но тогда не все ли равно, в каком виде представляется код, который генерирует визуальный редактор — в XAML, C# или вообще в бинарном формате?
Утверждения неверны,имхо.См. выше.
А>Но ваша идея с WPF в C# имеет очевидный недостаток — сложная и трудоемкая запись. Синтаксис C# вы ведь не расширяете, не приближаете его к предметной области.
Тут полностью согласен
А>Для этого вам нужно было бы встроиться в компилятор C# и внести изменения в спецификацию языка (этакие «WPF extensions»).

Вообще, стремление изобретать велосипеды неистребимо в российском программисте. А по поводу данного конкретного велосипеда — если бы Майкрософт избрала путь,предложенный автором топика, то не думаю, что WPF была бы легче в освоении. Человеческий мозг так устроен, что ему проще видеть целую картину из некоего декларативного описания(HTML,XAML,XML etc), чем из нескольких сотен строчек кода, которые очень тяжело визуализировать во внятную картинку. А в целом, если кодогенератор данный позволяет реализовать все(я подчеркиваю, все) сценарии, реализуемые в XAML, почему бы и нет. Проблемы тут начнутся на больших приложениях с развесистым UI. Вот тут редактирование и изменение может превратиться в реальный кошмар. Я бы проект, написанный подобным образом, править бы не решился.
Re[3]: C# vs. XAML
От: Codechanger Россия  
Дата: 23.09.09 12:33
Оценка:
Ну и в догонку — XAML позволяет без перекомпиляции изменять внешний вид UI(если правильно организовать структуру приложения), что тоже является несомненным плюсом с моей точки зрения.
Re[9]: C# vs. XAML
От: Alexander Polyakov  
Дата: 23.09.09 23:34
Оценка:
C>З.Ы. А увидеть код все-таки хочется. Чтобы читаемость сравнить.
Если Вы хотите в точности тот фрагмент, то вот. Но все же, зачем это надо?
            const string template2 = "Template2";
            const string template3 = "Template3";
            const string template1 = "template1";
            this.Nested(
                new Grid().Resources(
                    new ResourceDictionary
                        {
                            {
                                template1,
                                new TextBox().Text("t1").ToDataTemplate()
                            },
                            {
                                template2,
                                new Grid().RowDefinitions(
                                new RowDefinition().Height_Auto(),
                                new RowDefinition().Height_Auto()).Nested(
                                new TextBlock().Text("template2"),
                                new ContentPresenter().Grid_Row(1).Content(new Binding()).ContentTemplate(new Resource(template1))
                                ).ToDataTemplate()
                            },
                            {
                                template3,
                                new Grid().RowDefinitions(
                                new RowDefinition().Height_Auto(),
                                new RowDefinition().Height_Auto()).Nested(
                                new TextBlock().Text("template3"),
                                new ContentPresenter().Grid_Row(1).Content(new Binding()).ContentTemplate(new Resource(template2))
                                ).ToDataTemplate()
                            }
                        }).Nested(
                    new ContentPresenter().ContentTemplate(new Resource(template3))
                    )
                );
http://propertyexpression.codeplex.com/SourceControl/changeset/view/43919#762610
Отмечу, что это пока эксперименты.

C>А по поводу инлайн- темплейтов — смысла их так объявлять нету никакого.Иначе пример получается надуманным и сильно оторванным от реальной жизни.

То есть этот огород с темплейтами и ресурсами только ради того, чтобы вынести часть кода в отдельный файл? На C#-е это делается через простое выделение куска кода в метод. Показать, как это без темплейтов и ресурсов выглядит на C#?

C>Поскольку возникают вопросы, почему темплейты в ресурсах и т.д., я прихожу к выводу, что требуюмую гибкость Ваш кодогенератор обеспечить все-таки не может.

Вы всегда так поспешны с выводами? Если да, то вы много интересного пропускаете .

C>Думаю, в конце концов Вы придете к мысли, что не получится покрыть все сценарии, которые могут быть реализованы в XAML.

Что значит, не получится покрыть? На худой конец, можно просто реализовать паттерн билдер для построения XAML-а. И тогда любой код на XAML можно переписать на C#-е. Весь вопрос во временных затратах и в удобстве получаемого синтаксиса. Оценкой этих двух вещей я и занимаюсь сейчас, а Вы почему-то решили, что уже что-то сделано. Спасибо за помощь в этом процессе, ваши вопросы оказались весьма полезными .
Re[3]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 00:17
Оценка:
C>Вообще, стремление изобретать велосипеды неистребимо в российском программисте. А по поводу данного конкретного велосипеда — если бы Майкрософт...

C>Человеческий мозг так устроен, что ему проще видеть целую картину из некоего декларативного описания(HTML,XAML,XML etc), чем из нескольких сотен строчек кода, которые очень тяжело визуализировать во внятную картинку. А в целом, если кодогенератор данный позволяет реализовать все(я подчеркиваю, все) сценарии, реализуемые в XAML, почему бы и нет. Проблемы тут начнутся на больших приложениях с развесистым UI. Вот тут редактирование и изменение может превратиться в реальный кошмар. Я бы проект, написанный подобным образом, править бы не решился.

Все наоборот. Эта деятельность, как раз, нацелена на большие проекты. Недостатки XAML-а, против которых нацелен мой проект (см. первый пост), становятся головной болью именно на больших проектах. На небольших проектах можно и копипастом поддерживать UI в консистентном состоянии. Преимущества языка (в данном случае C#) с развитыми механизмами реюза кусков кода проявляются именно на больших проектах (возможно, на группе проектов, где используются общие куски UI-я). На C#-е код получается логически более чистым, поэтому в него легче вносить изменения. В большом проекте "целую картину" вы все равно не увидите, поэтому остается полагаться на "острый инструмент". А XAML, к сожалению, таким не является.
Re[4]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 00:20
Оценка:
C>Ну и в догонку — XAML позволяет без перекомпиляции изменять внешний вид UI(если правильно организовать структуру приложения), что тоже является несомненным плюсом с моей точки зрения.
А C# 5.0 нам не поможет?
Re[3]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 00:24
Оценка:
C>Вообще, стремление изобретать велосипеды неистребимо в российском программисте. А по поводу данного конкретного велосипеда — если бы Майкрософт избрала путь...
Вы уверены, что правильно понимаете и употребляете термин “изобретать велосипед”?
Re[10]: C# vs. XAML
От: Codechanger Россия  
Дата: 24.09.09 07:41
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

C>>З.Ы. А увидеть код все-таки хочется. Чтобы читаемость сравнить.

AP>Если Вы хотите в точности тот фрагмент, то вот. Но все же, зачем это надо?
AP>
AP>            const string template2 = "Template2";
AP>            const string template3 = "Template3";
AP>            const string template1 = "template1";
AP>            this.Nested(
AP>                new Grid().Resources(
AP>                    new ResourceDictionary
AP>                        {
AP>                            {
AP>                                template1,
AP>                                new TextBox().Text("t1").ToDataTemplate()
AP>                            },
AP>                            {
AP>                                template2,
AP>                                new Grid().RowDefinitions(
AP>                                new RowDefinition().Height_Auto(),
AP>                                new RowDefinition().Height_Auto()).Nested(
AP>                                new TextBlock().Text("template2"),
AP>                                new ContentPresenter().Grid_Row(1).Content(new Binding()).ContentTemplate(new Resource(template1))
AP>                                ).ToDataTemplate()
AP>                            },
AP>                            {
AP>                                template3,
AP>                                new Grid().RowDefinitions(
AP>                                new RowDefinition().Height_Auto(),
AP>                                new RowDefinition().Height_Auto()).Nested(
AP>                                new TextBlock().Text("template3"),
AP>                                new ContentPresenter().Grid_Row(1).Content(new Binding()).ContentTemplate(new Resource(template2))
AP>                                ).ToDataTemplate()
AP>                            }
AP>                        }).Nested(
AP>                    new ContentPresenter().ContentTemplate(new Resource(template3))
AP>                    )
AP>                );
AP>
http://propertyexpression.codeplex.com/SourceControl/changeset/view/43919#762610

AP>Отмечу, что это пока эксперименты.

Читаемость теряется, к сожалению.

C>Думаю, в конце концов Вы придете к мысли, что не получится покрыть все сценарии, которые могут быть реализованы в XAML.
Что значит, не получится покрыть? На худой конец, можно просто реализовать паттерн билдер для построения XAML-а. И тогда любой код на XAML можно переписать на C#-е. Весь вопрос во временных затратах и в удобстве получаемого синтаксиса. Оценкой этих двух вещей я и занимаюсь сейчас, а Вы почему-то решили, что уже что-то сделано. Спасибо за помощь в этом процессе, ваши вопросы оказались весьма полезными .

Ну хоть чем-то помог .Возможно я не в теме, но все же, не совсем ясны стремления, подвигнувшие вас на этот шаг. Вы не разобрались в XAML? Или лично Вам проще читать код, приведенный выше, который по сути от XAML ничем не отличается(такой же язык разметки, но основанный не на XML)? Что ж, я только за разнообразие, но пользоваться буду тем, чем удобнее.
З.Ы. Сдается мне, в конце концов данный язык будет сильно похож на XAML .
З.Ы.Ы.Пользоваться данным генератором не рискну — скорость разработки важнее,как, впрочем, и наглядность кода.
З.Ы.Ы.Ы. Мы еще не обсудили вариант со сложными биндингами, кстати.(RelativeSource,FindAncestor и т.д.).
Re[11]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 08:50
Оценка:
C>... но пользоваться буду тем, чем удобнее.
И все же, приведите код для реализации формочки из первого поста. Хотя бы схематично, интересен момент, как вы будите реализовывать две одинаковые секции Customer, Dealer, каждая из них имеет свой заголовок и свое внутреннее содержание. Будите ли Вы реюзать этот кусок разметки или скопипастите?
Re[12]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 09:04
Оценка:
Все же, лучше увидеть полную реализацию формочки на XAML-е. Как будут выглядеть стили, тоже интересно.
Re[13]: C# vs. XAML
От: Codechanger Россия  
Дата: 24.09.09 10:38
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

AP>Все же, лучше увидеть полную реализацию формочки на XAML-е. Как будут выглядеть стили, тоже интересно.



<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
  <DataTemplate x:Key="FieldTemplate">
  <Grid>
  <Grid.ColumnDefinitions>
  <ColumnDefinition SharedSizeGroup="group"  Width="100"/>
   <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
   <TextBlock  TextWrapping="Wrap"  Margin="4,2" VerticalAlignment="Center" Text="{Binding}"/>
  <TextBox Margin="2" VerticalAlignment="Center" Grid.Column="1"/>
  </Grid>
  </DataTemplate>
  <DataTemplate x:Key="DealerTemplate">
  <Grid Grid.IsSharedSizeScope="true">
  <Grid.RowDefinitions>
  <RowDefinition Height="Auto"/>
  <RowDefinition Height="Auto"/>
  </Grid.RowDefinitions>
  <ContentPresenter HorizontalAlignment="Stretch" Content="First Contact name:" ContentTemplate="{StaticResource FieldTemplate}"/>
  <ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Content="Second Contact name:"   ContentTemplate="{StaticResource FieldTemplate}"/>
  </Grid>
  </DataTemplate>
  <DataTemplate x:Key="CustomerTemplate">
  <Grid Grid.IsSharedSizeScope="true">
  <Grid.RowDefinitions>
  <RowDefinition Height="Auto"/>
  <RowDefinition Height="Auto"/>
  <RowDefinition Height="Auto"/>
  <RowDefinition Height="Auto"/>
  <RowDefinition Height="Auto"/>
   <RowDefinition Height="Auto"/>
  </Grid.RowDefinitions>
   <ContentPresenter HorizontalAlignment="Stretch" Content="Name:" ContentTemplate="{StaticResource FieldTemplate}"/>
   <ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Content="Contact name:" ContentTemplate="{StaticResource FieldTemplate}"/>
   <ContentPresenter Grid.Row="3" HorizontalAlignment="Stretch" Content="Address:" ContentTemplate="{StaticResource FieldTemplate}"/>
  <Grid Grid.Row="2" Grid.IsSharedSizeScope="false" >
  <Grid.ColumnDefinitions>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <ContentPresenter Content="Phone:" ContentTemplate="{StaticResource FieldTemplate}"/>
  <ContentPresenter Grid.Column="1" Content="Fax:" ContentTemplate="{StaticResource FieldTemplate}"/>
  </Grid>
  <Grid Grid.Row="4" >
  <Grid.ColumnDefinitions>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <ContentPresenter Content="City:" ContentTemplate="{StaticResource FieldTemplate}"/>
  <ContentPresenter Grid.Column="1" Content="State\province:" ContentTemplate="{StaticResource FieldTemplate}"/>
  </Grid>
  <Grid Grid.Row="5" >
  <Grid.ColumnDefinitions>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <ContentPresenter Content="Zip/Postal code:" ContentTemplate="{StaticResource FieldTemplate}"/>
  <ContentPresenter Grid.Column="1" Content="Country:" ContentTemplate="{StaticResource FieldTemplate}"/>
  </Grid>
  </Grid>
  </DataTemplate>
 <Style x:Key="{x:Type GroupBox}"
       TargetType="{x:Type GroupBox}">
  <Setter Property="BorderBrush"
          Value="Gray"/>
  <Setter Property="Foreground"
          Value="Black"/>
  <Setter Property="BorderThickness"
          Value="1"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type GroupBox}">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
          </Grid.RowDefinitions>
          <Border
                  BorderThickness="{TemplateBinding BorderThickness}"
                  BorderBrush="Gray"
                  Background="LightGray">
            <TextBlock Margin="14,4" Foreground="White" FontSize="12pt" Text="{TemplateBinding Header}" />
                 </Border>
          <!-- ContentPresenter for the header -->
      
          <!-- Primary content for GroupBox -->
           <Border CornerRadius="0"
                  Grid.Row="1"
                  Grid.RowSpan="3"
                  Grid.ColumnSpan="4"
                  BorderThickness="{TemplateBinding BorderThickness}"
                  BorderBrush="{TemplateBinding BorderBrush}">
          <ContentPresenter  Margin="{TemplateBinding Padding}"/>   
          </Border>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
  </Page.Resources>
  <Grid> 
   <Grid.ColumnDefinitions>
   <ColumnDefinition Width="*"/>
   <ColumnDefinition Width="*"/>
   </Grid.ColumnDefinitions>
   <GroupBox Margin="7" Padding="14,4" Header="Customer">
     <ContentPresenter ContentTemplate="{StaticResource CustomerTemplate}"/>
   </GroupBox>
   <GroupBox Grid.Column="1" Margin="7" Padding="14,4" Header="Dealer">
     <ContentPresenter ContentTemplate="{StaticResource DealerTemplate}"/>
   </GroupBox>
  </Grid>
</Page>
Re[8]: C# vs. XAML
От: notacat  
Дата: 24.09.09 11:01
Оценка:
AP>Почему в примере темплейты просто не вложены друг в друга, а используются ссылки через ресурсы? Использование ресурсов это принципиально?
А вы поизучайте как раз этот вопрос. Именно тут в xaml'е находится повторное использование без копипаста. И ваши две формочки из первого поста именно так и делаются, ничего копировать для этого не нужно (хотя их можно и другими способами без копипаста реализовать).
Re[13]: C# vs. XAML
От: Vladek Россия Github
Дата: 24.09.09 11:03
Оценка: 1 (1)
Здравствуйте, Alexander Polyakov, Вы писали:

AP>Все же, лучше увидеть полную реализацию формочки на XAML-е. Как будут выглядеть стили, тоже интересно.


В случае реального приложения, такого кода будет ещё меньше за счёт использования биндингов и шаблонов данных. Разметка резиновая.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <Window.Resources>
  <Style x:Key="Container" TargetType="{x:Type HeaderedItemsControl}">
   <Setter Property="Margin" Value="4"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
      <Grid>
       <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
       </Grid.RowDefinitions>
       <Rectangle Grid.RowSpan="2" Stroke="Gray" StrokeThickness="1"/>
       <TextBlock Grid.Row="0" Padding="4,3" Background="Gray" Foreground="White" Text="{TemplateBinding Header}"/>
       <ItemsPresenter Margin="4" Grid.Row="1" />
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  
  <Style TargetType="{x:Type HeaderedContentControl}">
   <Setter Property="Margin" Value="2"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
      <Grid>
       <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".3*"/>
        <ColumnDefinition Width=".8*"/>
       </Grid.ColumnDefinitions>
       <Label Grid.Column="0" VerticalAlignment="Center" Target="{Binding ElementName=Ctrl}">
        <TextBlock Text="{TemplateBinding Header}" TextWrapping="Wrap"/>
       </Label>
       <TextBox Grid.Column="1" Name="Ctrl" VerticalAlignment="Center"
                Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  
 </Window.Resources>
 <Grid>
  <Grid.ColumnDefinitions>
   <ColumnDefinition Width="*"/>
   <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  
  <HeaderedItemsControl Grid.Column="0" Style="{StaticResource Container}" Header="Customer">
   <HeaderedContentControl Header="Name:" Content=""/>
   <HeaderedContentControl Header="Contact Name:" Content=""/>
   <Grid>
    <Grid.ColumnDefinitions>
     <ColumnDefinition Width=".5*"/>
     <ColumnDefinition Width=".5*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
     <RowDefinition/>
     <RowDefinition/>
     <RowDefinition/>
     <RowDefinition/>
    </Grid.RowDefinitions>
    <HeaderedContentControl Grid.Row="0" Grid.Column="0" Header="Phone:" Content=""/>
    <HeaderedContentControl Grid.Row="0" Grid.Column="1" Header="Fax:" Content=""/>
    <HeaderedContentControl Grid.Row="1" Grid.ColumnSpan="2" Header="Address:" Content=""/>
    <HeaderedContentControl Grid.Row="2" Grid.Column="0" Header="City:" Content=""/>
    <HeaderedContentControl Grid.Row="2" Grid.Column="1" Header="State/Province:" Content=""/>
    <HeaderedContentControl Grid.Row="3" Grid.Column="0" Header="Zip/Postal code:" Content=""/>
    <HeaderedContentControl Grid.Row="3" Grid.Column="1" Header="Country:" Content=""/>
   </Grid>
  </HeaderedItemsControl>
  
  <HeaderedItemsControl Grid.Column="1" Style="{StaticResource Container}" Header="Dealer">
   <HeaderedContentControl Header="First Contact Name:" Content=""/>
   <HeaderedContentControl Header="Second Contact Name:" Content=""/>
  </HeaderedItemsControl>
  
 </Grid>
</Window>
I see dead pixels...
Re[4]: C# vs. XAML
От: notacat  
Дата: 24.09.09 11:08
Оценка: +1
AP>Все наоборот. Эта деятельность, как раз, нацелена на большие проекты. Недостатки XAML-а, против которых нацелен мой проект (см. первый пост), становятся головной болью именно на больших проектах. На небольших проектах можно и копипастом поддерживать UI в консистентном состоянии.
Вы всерьез полагаете, что вашим изобретением никто не сможет пользоваться так же, как вы пользуетесь xaml'ом — с копипастом и прочими недостатками?
Лучше давайте по пунктам, какие недостатки xaml'а вы видите, кроме того, что вам приходится копипастить (именно вам, по идее там это совсем не нужно, а как раз наоборот) и что нельзя вынести что-то в отдельный метод? Читаю ваши сообщения, читаю, код ваш смотрела — никак яснее не могу для себя вашу точку зрения сформулировать. С чего вдруг стили не будут куда-то укладываться, а код уложится? Может надо какую-то конкретную задачку взять, на которой у вас все вопросы к xaml'у возникли, и решить ее нормально, чтобы уже четко понять — есть ли реальная проблема, или это ваше непонимание.
Re[10]: C# vs. XAML
От: notacat  
Дата: 24.09.09 11:23
Оценка:
C>>Думаю, в конце концов Вы придете к мысли, что не получится покрыть все сценарии, которые могут быть реализованы в XAML.
AP>Что значит, не получится покрыть? На худой конец, можно просто реализовать паттерн билдер для построения XAML-а. И тогда любой код на XAML можно переписать на C#-е.
Понятно, что можно сделать практически все, кроме высовывания долларов из cd привода, а зачем?
Т.е., когда вы говорите о недостатках xaml'а, я еще понимаю, что я возможно не все понимаю. Но переписать любой xaml на c# — это уже просто ради того, чтобы переписать?
Ну и потом, почитайте, например документацию к FrameworkElementFactory — не все можно создать в коде просто по определению. И, судя по тому, что в Сильверлайте темплейт можно ТОЛЬКО загрузить из xaml, то и дальнейшее развитие этой темы в WPF пойдет в эту же сторону.
Рано или поздно уткнетесь в то, что не сможете использовать все возможности WPF, а вынуждены будете делать какие-то вещи в стиле WinForms.
Re[14]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 12:34
Оценка:
C>
C><Page
C>  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
C>  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
C>  <Page.Resources>
C>  <DataTemplate x:Key="FieldTemplate">
C>  <Grid>
C>  <Grid.ColumnDefinitions>
C>  <ColumnDefinition SharedSizeGroup="group"  Width="100"/>
C>   <ColumnDefinition Width="*"/>
C>  </Grid.ColumnDefinitions>
C>   <TextBlock  TextWrapping="Wrap"  Margin="4,2" VerticalAlignment="Center" Text="{Binding}"/>
C>  <TextBox Margin="2" VerticalAlignment="Center" Grid.Column="1"/>
C>  </Grid>
C>  </DataTemplate>
C>  <DataTemplate x:Key="DealerTemplate">
C>  <Grid Grid.IsSharedSizeScope="true">
C>  <Grid.RowDefinitions>
C>  <RowDefinition Height="Auto"/>
C>  <RowDefinition Height="Auto"/>
C>  </Grid.RowDefinitions>
C>  <ContentPresenter HorizontalAlignment="Stretch" Content="First Contact name:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  <ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Content="Second Contact name:"   ContentTemplate="{StaticResource FieldTemplate}"/>
C>  </Grid>
C>  </DataTemplate>
C>  <DataTemplate x:Key="CustomerTemplate">
C>  <Grid Grid.IsSharedSizeScope="true">
C>  <Grid.RowDefinitions>
C>  <RowDefinition Height="Auto"/>
C>  <RowDefinition Height="Auto"/>
C>  <RowDefinition Height="Auto"/>
C>  <RowDefinition Height="Auto"/>
C>  <RowDefinition Height="Auto"/>
C>   <RowDefinition Height="Auto"/>
C>  </Grid.RowDefinitions>
C>   <ContentPresenter HorizontalAlignment="Stretch" Content="Name:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>   <ContentPresenter Grid.Row="1" HorizontalAlignment="Stretch" Content="Contact name:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>   <ContentPresenter Grid.Row="3" HorizontalAlignment="Stretch" Content="Address:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  <Grid Grid.Row="2" Grid.IsSharedSizeScope="false" >
C>  <Grid.ColumnDefinitions>
C>  <ColumnDefinition Width="*"/>
C>  <ColumnDefinition Width="*"/>
C>  </Grid.ColumnDefinitions>
C>  <ContentPresenter Content="Phone:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  <ContentPresenter Grid.Column="1" Content="Fax:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  </Grid>
C>  <Grid Grid.Row="4" >
C>  <Grid.ColumnDefinitions>
C>  <ColumnDefinition Width="*"/>
C>  <ColumnDefinition Width="*"/>
C>  </Grid.ColumnDefinitions>
C>  <ContentPresenter Content="City:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  <ContentPresenter Grid.Column="1" Content="State\province:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  </Grid>
C>  <Grid Grid.Row="5" >
C>  <Grid.ColumnDefinitions>
C>  <ColumnDefinition Width="*"/>
C>  <ColumnDefinition Width="*"/>
C>  </Grid.ColumnDefinitions>
C>  <ContentPresenter Content="Zip/Postal code:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  <ContentPresenter Grid.Column="1" Content="Country:" ContentTemplate="{StaticResource FieldTemplate}"/>
C>  </Grid>
C>  </Grid>
C>  </DataTemplate>
C> <Style x:Key="{x:Type GroupBox}"
C>       TargetType="{x:Type GroupBox}">
C>  <Setter Property="BorderBrush"
C>          Value="Gray"/>
C>  <Setter Property="Foreground"
C>          Value="Black"/>
C>  <Setter Property="BorderThickness"
C>          Value="1"/>
C>  <Setter Property="Template">
C>    <Setter.Value>
C>      <ControlTemplate TargetType="{x:Type GroupBox}">
C>        <Grid>
C>          <Grid.RowDefinitions>
C>            <RowDefinition Height="Auto"/>
C>            <RowDefinition Height="*"/>
C>          </Grid.RowDefinitions>
C>          <Border
C>                  BorderThickness="{TemplateBinding BorderThickness}"
C>                  BorderBrush="Gray"
C>                  Background="LightGray">
C>            <TextBlock Margin="14,4" Foreground="White" FontSize="12pt" Text="{TemplateBinding Header}" />
C>                 </Border>
C>          <!-- ContentPresenter for the header -->
      
C>          <!-- Primary content for GroupBox -->
C>           <Border CornerRadius="0"
C>                  Grid.Row="1"
C>                  Grid.RowSpan="3"
C>                  Grid.ColumnSpan="4"
C>                  BorderThickness="{TemplateBinding BorderThickness}"
C>                  BorderBrush="{TemplateBinding BorderBrush}">
C>          <ContentPresenter  Margin="{TemplateBinding Padding}"/>   
C>          </Border>
C>        </Grid>
C>      </ControlTemplate>
C>    </Setter.Value>
C>  </Setter>
C></Style>
C>  </Page.Resources>
C>  <Grid> 
C>   <Grid.ColumnDefinitions>
C>   <ColumnDefinition Width="*"/>
C>   <ColumnDefinition Width="*"/>
C>   </Grid.ColumnDefinitions>
C>   <GroupBox Margin="7" Padding="14,4" Header="Customer">
C>     <ContentPresenter ContentTemplate="{StaticResource CustomerTemplate}"/>
C>   </GroupBox>
C>   <GroupBox Grid.Column="1" Margin="7" Padding="14,4" Header="Dealer">
C>     <ContentPresenter ContentTemplate="{StaticResource DealerTemplate}"/>
C>   </GroupBox>
C>  </Grid>
C></Page>
C>

Скриншот для указанной мной формы рисовал профессиональный дизайнер. Требуется в точности соблюсти все задумки дизайнера. Если какие-то правила лайаута не видны из рисунка, их можно уточнить у дизайнера (сейчас можно спросить у меня или посмотреть в C# код). Сейчас ваша реализация выглядит некрасиво. Отмазка, что Вы не прописывали все детали, не катит, поскольку кода Вы написали уже больше, чем в моей C# реализации.
То, что увидел при первом просмотре:
1. Текст “Fax:” должен быть прижат к правому краю.
2. В оригинале текст “State\province:” выдавливает свой текстбокс вправо. Но при этом текстбоксы для Fax и Country выровнены по линии.
3. Ширина колонки для лейблов должна выравниваться по максимальному тексту в колонке. У Вас же тупо захарткожено Width="100", причем для обоих колонок (ширина колонок необязательно одинакова).
4. Все три шрифта (в заголовке секции, в лайблах, в текстбоксах) должны иметь одни и те же FontFamily=”Tahoma” Font Size=”11”.

Остальные комментарии позже.
Re[5]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 12:39
Оценка:
AP>>Может надо какую-то конкретную задачку взять, на которой у вас все вопросы к xaml'у возникли, и решить ее нормально, чтобы уже четко понять — есть ли реальная проблема, или это ваше непонимание.
Да, можете реализовать формочку из первого поста. Вот здесь
Автор: Codechanger
Дата: 24.09.09
уже идет попытки.
Re[9]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 12:40
Оценка:
N>Именно тут в xaml'е находится повторное использование без копипаста. И ваши две формочки из первого поста именно так и делаются, ничего копировать для этого не нужно (хотя их можно и другими способами без копипаста реализовать).
Ждем от Вас вариант формочки.
Re[14]: C# vs. XAML
От: Alexander Polyakov  
Дата: 24.09.09 12:48
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Здравствуйте, Alexander Polyakov, Вы писали:


AP>>Все же, лучше увидеть полную реализацию формочки на XAML-е. Как будут выглядеть стили, тоже интересно.


V>В случае реального приложения, такого кода будет ещё меньше за счёт использования биндингов и шаблонов данных. Разметка резиновая.


V>
V><Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
V> <Window.Resources>
V>  <Style x:Key="Container" TargetType="{x:Type HeaderedItemsControl}">
V>   <Setter Property="Margin" Value="4"/>
V>   <Setter Property="Template">
V>    <Setter.Value>
V>     <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
V>      <Grid>
V>       <Grid.RowDefinitions>
V>        <RowDefinition Height="Auto"/>
V>        <RowDefinition Height="Auto"/>
V>       </Grid.RowDefinitions>
V>       <Rectangle Grid.RowSpan="2" Stroke="Gray" StrokeThickness="1"/>
V>       <TextBlock Grid.Row="0" Padding="4,3" Background="Gray" Foreground="White" Text="{TemplateBinding Header}"/>
V>       <ItemsPresenter Margin="4" Grid.Row="1" />
V>      </Grid>
V>     </ControlTemplate>
V>    </Setter.Value>
V>   </Setter>
V>  </Style>
  
V>  <Style TargetType="{x:Type HeaderedContentControl}">
V>   <Setter Property="Margin" Value="2"/>
V>   <Setter Property="Template">
V>    <Setter.Value>
V>     <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
V>      <Grid>
V>       <Grid.ColumnDefinitions>
V>        <ColumnDefinition Width=".3*"/>
V>        <ColumnDefinition Width=".8*"/>
V>       </Grid.ColumnDefinitions>
V>       <Label Grid.Column="0" VerticalAlignment="Center" Target="{Binding ElementName=Ctrl}">
V>        <TextBlock Text="{TemplateBinding Header}" TextWrapping="Wrap"/>
V>       </Label>
V>       <TextBox Grid.Column="1" Name="Ctrl" VerticalAlignment="Center"
V>                Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
V>      </Grid>
V>     </ControlTemplate>
V>    </Setter.Value>
V>   </Setter>
V>  </Style>
  
V> </Window.Resources>
V> <Grid>
V>  <Grid.ColumnDefinitions>
V>   <ColumnDefinition Width="*"/>
V>   <ColumnDefinition Width="*"/>
V>  </Grid.ColumnDefinitions>
  
V>  <HeaderedItemsControl Grid.Column="0" Style="{StaticResource Container}" Header="Customer">
V>   <HeaderedContentControl Header="Name:" Content=""/>
V>   <HeaderedContentControl Header="Contact Name:" Content=""/>
V>   <Grid>
V>    <Grid.ColumnDefinitions>
V>     <ColumnDefinition Width=".5*"/>
V>     <ColumnDefinition Width=".5*"/>
V>    </Grid.ColumnDefinitions>
V>    <Grid.RowDefinitions>
V>     <RowDefinition/>
V>     <RowDefinition/>
V>     <RowDefinition/>
V>     <RowDefinition/>
V>    </Grid.RowDefinitions>
V>    <HeaderedContentControl Grid.Row="0" Grid.Column="0" Header="Phone:" Content=""/>
V>    <HeaderedContentControl Grid.Row="0" Grid.Column="1" Header="Fax:" Content=""/>
V>    <HeaderedContentControl Grid.Row="1" Grid.ColumnSpan="2" Header="Address:" Content=""/>
V>    <HeaderedContentControl Grid.Row="2" Grid.Column="0" Header="City:" Content=""/>
V>    <HeaderedContentControl Grid.Row="2" Grid.Column="1" Header="State/Province:" Content=""/>
V>    <HeaderedContentControl Grid.Row="3" Grid.Column="0" Header="Zip/Postal code:" Content=""/>
V>    <HeaderedContentControl Grid.Row="3" Grid.Column="1" Header="Country:" Content=""/>
V>   </Grid>
V>  </HeaderedItemsControl>
  
V>  <HeaderedItemsControl Grid.Column="1" Style="{StaticResource Container}" Header="Dealer">
V>   <HeaderedContentControl Header="First Contact Name:" Content=""/>
V>   <HeaderedContentControl Header="Second Contact Name:" Content=""/>
V>  </HeaderedItemsControl>
  
V> </Grid>
V></Window>
V>

Вы результат смотрели?

Что-то совсем грустно, даже вариант от Codechanger лучше.
Re[15]: C# vs. XAML
От: notacat  
Дата: 24.09.09 12:51
Оценка:
AP>4. Все три шрифта (в заголовке секции, в лайблах, в текстбоксах) должны иметь одни и те же FontFamily=”Tahoma” Font Size=”11”.
вот по этому пункту, сдается мне, достаточно все упоминания шрифтов в разных элементах поудалять и один раз в свойствах страницы написать FontFamily и FontSize.
AP> Скриншот для указанной мной формы рисовал профессиональный дизайнер. Требуется в точности соблюсти все задумки дизайнера. Если какие-то правила лайаута не видны из рисунка, их можно уточнить у дизайнера (сейчас можно спросить у меня или посмотреть в C# код).
Я не уверена, что кто-то из ваших оппонентов обязался соблюдать все в точности и спрашивать у дизайнера или вашего кода. По-моему, большинство присутствующих считают, что достаточно показать принцип, а дальше вы сами сообразите.
В реальных проектах, программист ничего не спрашивает у дизайнера, потому что дизайнер сам все это сделает, а программист просто вставит в проект.
Ну или наоборот — я, например, делаю рыбу с триггерами, байндингами и т.п. вещами, которые нужны для правильного функционирования, а потом отдаю все дизайнеру и больше об этом не вспоминаю. Очень хорошо делится работа, не надо тратить время на уточнение, чего хотел дизайнер.
Re[10]: C# vs. XAML
От: notacat  
Дата: 24.09.09 12:53
Оценка:
N>>Именно тут в xaml'е находится повторное использование без копипаста. И ваши две формочки из первого поста именно так и делаются, ничего копировать для этого не нужно (хотя их можно и другими способами без копипаста реализовать).
AP>Ждем от Вас вариант формочки.
Времени нет. Если бы это обсуждение было в форуме про .Net, большинству сказанного было бы достаточно. Или автор вопроса сам предлагал бы варианты, а его поправляли бы. Это же публичный форум, а не техсаппорт.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.