2011-12-17 3 views
9

В настоящее время я устанавливаю фон на каждую сетку строку по отдельности:Назначение границы для каждой сетку строки

<Grid> 
    <Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions> 
    <Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions> 

    <Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="6" Height="24" BorderBrush="#FF252A30" CornerRadius="10" BorderThickness="1"> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="1.036,0.367" StartPoint="-0.194,0.362"> 
       <GradientStop Color="#AAE098" Offset="0.1"/> 
       <GradientStop Color="#D5E9D4" Offset="0.9"/> 
      </LinearGradientBrush> 
     </Border.Background> 
    </Border> 

    <Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="6" Height="24" BorderBrush="#FF252A30" CornerRadius="10" BorderThickness="1"> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="1.036,0.367" StartPoint="-0.194,0.362"> 
       <GradientStop Color="#AAE098" Offset="0.1"/> 
       <GradientStop Color="#D5E9D4" Offset="0.9"/> 
      </LinearGradientBrush> 
     </Border.Background> 
    </Border> 
</Grid> 

Конечно, должен быть каким-то образом установить эту границу один раз для всех строк. Как это делается?

Спасибо!

ответ

2

Вы можете вытащить эту границу в ресурс многократного использования, но я подозреваю, что вы действительно пытаетесь сделать, это создать GridView.

+0

Я думаю, что вы, безусловно, правы. Что такое «многоразовый ресурс», в который я могу поставить границу? – dotancohen

2

Вы можете просто установить Background недвижимость на Grid. Если есть общность между границей которой вы обращаетесь к разным строкам, вы можете создать стиль по умолчанию (и при желании ограничить сферу применения этого стиля самого Grid):

XAML

<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type Border}"> 
      <!-- All rows --> 
      <Setter Property="BorderBrush" Value="Black" /> 
      <Setter Property="BorderThickness" Value="2" /> 
      <Setter Property="CornerRadius" Value="5" /> 
     </Style> 
    </Grid.Resources> 

    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <Border Grid.Row="0"> 
     <TextBlock Text="This row has a black border (default)." /> 
    </Border> 

    <Border BorderBrush="Red" Grid.Row="1"> 
     <TextBlock Text="This row has a red border." /> 
    </Border> 

    <Border BorderBrush="Green" BorderThickness="4" Grid.Row="2"> 
     <TextBlock Text="This has a thick green border." /> 
    </Border> 

</Grid> 

По умолчанию Style, дополнительное свойство не должно быть установлено в вашей строке Border, чтобы получить представление по умолчанию (строка выше). Если определенная строка нуждается в настройке внешнего вида, просто добавьте дополнительные свойства на Border, чтобы переопределить те, которые установлены по умолчанию Style (строки два и три выше). Если этот метод применяется к нескольким представлениям в вашем приложении, вы можете извлечь этот стиль в отдельный файл ResourceDictionary и просто слить его, когда это необходимо.

Надеюсь, это поможет!

+0

Привет, R Ruffell! Фон не является сплошным по всей сетке, а у каждой строки есть свои закругленные углы в начале первой ячейки и в конце последней ячейки. Кроме того, приведенный ниже пример требует, чтобы разработчик обновлял элемент Border для каждой строки отдельно, если изменяется требование к BorderThickness. – dotancohen

+0

Перемещение обычно заданных свойств в стиль по умолчанию, который привязан к сетке, тогда элемент Border не задает свойства (отличным от цвета, например), и этот подход не повторяется (например, BorderThickness указывается только один раз и, следовательно, необходимо обновлять только один раз). См. Отредактированный ответ выше :) –

+0

@F Ruffell: Спасибо, но стили по-прежнему затрагивают только отдельные ячейки, а не целые строки. Чтобы продемонстрировать, добавив атрибуты Grid.Column к элементам Border, можно заметить, что каждая ячейка имеет закругленные края, а не каждую строку. Моя цель состоит в том, чтобы каждая строка имела сплошной цвет, но с закругленными краями в углах ряда. Код в OP делает это, но он должен быть определен (и обновлен) для каждой строки отдельно. Я хотел бы описать это в стиле, который используется повторно для каждой строки. – dotancohen

15

Или вы могли бы использовать эту сетку, которую я только что сделал. Он автоматически добавит границу в каждую ячейку сетки. Это результат:

enter image description here

C#:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace GridWithBorder 
{ 
    public class BorderGrid : Grid 
    { 
     protected override void OnRender(DrawingContext dc) 
     { 
      double leftOffset = 0; 
      double topOffset = 0; 
      Pen pen = new Pen(Brushes.Black, 3); 
      pen.Freeze(); 

      foreach (RowDefinition row in this.RowDefinitions) 
      { 
       dc.DrawLine(pen, new Point(0, topOffset), new Point(this.ActualWidth, topOffset)); 
       topOffset += row.ActualHeight; 
      } 
      // draw last line at the bottom 
     dc.DrawLine(pen, new Point(0, topOffset), new Point(this.ActualWidth, topOffset)); 

      //foreach (ColumnDefinition column in this.ColumnDefinitions) 
      //{ 
      // dc.DrawLine(pen, new Point(leftOffset, 0), new Point(leftOffset, this.ActualHeight)); 
      // leftOffset += column.ActualWidth; 
      //} 
      // draw last line on the right 
      //dc.DrawLine(pen, new Point(leftOffset, 0), new Point(leftOffset, this.ActualHeight)); 

      base.OnRender(dc); 
     } 
    } 
} 

XAML:

<Window x:Class="GridWithBorder.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:GridWithBorder" 
     Title="MainWindow" Height="350" Width="525"> 
    <local:BorderGrid> 
     <local:BorderGrid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </local:BorderGrid.RowDefinitions> 
     <local:BorderGrid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </local:BorderGrid.ColumnDefinitions> 
     <Rectangle Grid.Row="0" Grid.Column="0" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="1" Fill="Blue" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="2" Fill="Orange" Margin="5" /> 
     <Rectangle Grid.Row="0" Grid.Column="3" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="0" Fill="Yellow" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="1" Fill="Green" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="2" Fill="Purple" Margin="5" /> 
     <Rectangle Grid.Row="1" Grid.Column="3" Fill="Green" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="0" Fill="Orange" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="1" Fill="Red" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="2" Fill="Blue" Margin="5" /> 
     <Rectangle Grid.Row="2" Grid.Column="3" Fill="Red" Margin="5" /> 
    </local:BorderGrid> 
</Window> 
+0

Спасибо, это умно. Мне трудно изменить его, чтобы помещать границы вокруг каждого _row_, а не каждой ячейки.Хорошая идея, однако, до этого момента я пытался сделать это только в XAML. – dotancohen

+0

@dotancohen ah ok, то просто прокомментируйте часть, которую я только что прокомментировал в коде C#, вы получите этот результат http://screencast.com/t/NwdxtGQNyq. Lmk, если вам нужна первая и последняя вертикальные линии (чтобы иметь границу вокруг всей сетки), я тоже могу это сделать. – Carlo

+0

@dotancohen пример границы вокруг сетки и строк, но не столбцов здесь: http://screencast.com/t/d8GNqXRKGPf – Carlo

Смежные вопросы