Пользовательская панель с альтернативным фоном - PullRequest
0 голосов
/ 29 июня 2010

Я хотел бы создать простую пользовательскую панель для разметки детей в деловой форме. В идеале я хотел бы, чтобы моя разметка выглядела так:

<Panels:FormPanel>
        <TextBlock Text="Name:"/>
        <TextBox />
        <TextBlock Text="Address"/>
        <TextBlock Text="Unknown"/>
        <TextBlock  Text="City"/>
        <TextBox HorizontalAlignment="Stretch"/>
        <TextBlock Text="State"/>
        <ComboBox/>
        <TextBlock  Text="Country"/>
        <StackPanel>...</StackPanel>
 </Panels:FormPanel>

Панель расположит элементы управления в виде двух столбцов с левой стороны и значений справа. У меня нет проблем с выкладыванием контроля. Проблема в том, что мне также нужно чередовать фон для строк, чтобы создать полосы для более удобного чтения. Есть идеи, как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Реализация пользовательской панели не так уж и сложна.Вы должны переопределить два метода, Measure и Arrange.Google для "пользовательской панели wpf", чтобы получить некоторые статьи об этом.

То, что я бы посоветовал вам сделать, чтобы получить поведение точно так, как вам требуется в вопросе, это расширение Windows.Controls.Grid.Ваша пользовательская сетка может тогда иметь по умолчанию два столбца, которые вы инициализируете в конструкторе, и вы можете программно установить свойства Grid.Column и Grid.Row для дочерних элементов управления.

Также стоит обратить внимание на ItemsControl.У него есть поддержка альтернативно окрашенных рядов.Этот пример ( из MSDN ) показывает, как его использовать:

<Grid>
  <Grid.Resources>
    <Style x:Key="alternatingWithTriggers" TargetType="{x:Type ListBoxItem}">
      <Setter Property="Background" Value="Blue"/>
      <Setter Property="Foreground" Value="White"/>
      <Style.Triggers>
        <Trigger Property="ListBox.AlternationIndex" Value="1">
          <Setter Property="Background" Value="CornflowerBlue"/>
          <Setter Property="Foreground" Value="Black"/>
        </Trigger>
        <Trigger Property="ListBox.AlternationIndex" Value="2">
          <Setter Property="Background" Value="LightBlue"/>
          <Setter Property="Foreground" Value="Navy"/>
        </Trigger>
      </Style.Triggers>
    </Style>

  </Grid.Resources>
  <ListBox AlternationCount="3" ItemsSource="{StaticResource data}" 
           ItemContainerStyle="{StaticResource alternatingWithTriggers}">
  </ListBox>
</Grid>

Затем вы можете указать шаблон для элементов, который включает в себя Label и TextBox, но заставить это работать можетбудьте осторожны.

Вот еще одна заключительная вещь, которую я предлагаю:

XAML Powertoys включает функции, которые позволяют генерировать бизнес-формы из ViewModels,ViewModels из моделей и многое другое.Возможно, вам придется изменить источник, чтобы получить чередующиеся цвета строк.

Удачи!

0 голосов
/ 29 июня 2010

Это не дает прямого ответа на ваш вопрос, но вы можете рассматривать это как еще одно решение основной проблемы.

Взгляните на http://wpg.codeplex.com/. Я использовал аналогичный элемент управления, похожий на свойство сетки, в Windows Forms, который был изменен для понимания пользовательских атрибутов моих бизнес-объектов.

Теперь, в WPF, я думаю, что нечто подобное будет работать очень хорошо, если вы будете следовать шаблону MVVM и украсить свою ViewModel атрибутами, которые понимает такая сетка свойств. Тогда вам не нужно явно определять поля, как показано выше.

Вы можете иметь ViewModel:

class PersonViewModel
{
    [DisplayName("Name")] // The property Grid uses this the Textblock text
    [IsRequired] // The property grid could do validation on the field
    [Visible]
    public string Name { get; set; }

    public long InvisibleSystemField { get; set; } // Not shown
}

И тогда у вас будут только виды (файлы Xaml), подобные этому:

<myCommon:PropertyGrid DataContext={Binding}/>

Он может просто использовать свой DataContext в качестве отправной точки для размышления.

ОК, я пока на этом остановлюсь:)

Я работаю над LOB-приложением на основе WPF и, возможно, в будущем создам что-то подобное.

...