2012-05-13 15 views
6

Mam siatkę. Muszę zdefiniować każdą kolumnę i wiersz ręcznie, tak:Jak ustawić rozmiar kolumny/wiersza siatki bez definiowania każdej linii?

<Window x:Class="GridBuild" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="GridBuild" Height="300" Width="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions>   
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions>   
</Grid> 

Chcę określić liczbę wierszy i kolumn z jednej linii, coś takiego:

<Window x:Class="GridBuild" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="GridBuild" Height="300" Width="300"> 
    <Grid> 
     <Grid.NumberOfRows="2"/> 
     <Grid.NumberOfColumns/> 
    </Grid> 
</Window> 

Odpowiedz

4

Proponuję wyprowadzić z Grid i dodać do niego następujące właściwości:

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

Teraz może on być stosowany w następujący sposób:

<local:GridEx NumberOfRows="3" NumberOfColumns="2"> 
    <TextBox>some text</TextBox> 
    <TextBox Grid.Row="1">some text</TextBox> 
    <TextBox Grid.Row="2">some text</TextBox> 

    <TextBox Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="1" Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="2" Grid.Column="1">some text</TextBox> 
</local:GridEx> 

Pracuje w projektanta, a także przez drogę :)

Wyzwaniem jest, aby ustawić inną szerokość, wysokość itp dla różnych wierszy i kolumn. Mam miłą myśl, jak to zrobić. Możliwe jest również zautomatyzowanie przypisywania Grid.Row i Grid.Column. Pomyśl o tym :)

7

To, co opisujesz, nazywa się UniformGrid. Ma właściwości Columns i Rows, dzięki którym można ustawić liczbę wierszy lub kolumn, które chcesz.

Jeśli nie ustawisz tych właściwości, UniformGrid spróbuje rozmieścić dzieci tak blisko kwadratów, jak to tylko możliwe. W tej sytuacji woli zwiększyć liczbę kolumn przed zwiększeniem liczby wierszy.

Jest to panel niejasny, ale przy prawidłowym użyciu jest niezwykle wydajny.

3

Powyższa odpowiedź EvAlex będzie działać, ale tylko wtedy, gdy nie chcesz ustawiać liczby kolumn/wierszy przy użyciu powiązania danych.

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

Jeśli chcesz ustawić je poprzez wiązania danych (tak jak ja), to z powyższego roztworu kompilator będzie narzekać, ponieważ musi DependencyProperties do tego. DependencyProperty mogą być realizowane (przy użyciu C# 6 w nameof operatora) w następujący sposób (szybki sposób, aby wstawić go używa propdp urywek):

public int Columns 
{ 
    get { return (int) GetValue(ColumnsDependencyProperty); } 
    set { SetValue(ColumnsDependencyProperty, value); } 
} 
public static readonly DependencyProperty ColumnsDependencyProperty = 
    DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

Ale w ten sposób nie można wykonać niezbędną logikę dodać niezbędne numer RowDefinitions. Aby rozwiązać ten problem, zdefiniuj DependencyPropertyDescriptor dla każdego DependencyProperty i dodaj wywołanie AddValueChanged z niezbędną logiką do swojego konstruktora klasy niestandardowej. Wynik za propery następnie (C# 6 jest zerem uzależnione od operatora ?.):

public int Columns 
    { 
     get { return (int) GetValue(ColumnsDependencyProperty); } 
     set { SetValue(ColumnsDependencyProperty, value); } 
    } 
    public static readonly DependencyProperty ColumnsDependencyProperty = 
     DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

    DependencyPropertyDescriptor ColumnsPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ColumnsDependencyProperty, typeof(GridEx)); 

    public GridEx() 
    { 
     ColumnsPropertyDescriptor?.AddValueChanged(this, delegate 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < Columns; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     }); 
    } 
Powiązane problemy