2013-08-31 2 views
3

Я организуя свою сетку с RowDefinitions и ColumnDefinition, но навсегда, когда я хочу добавить новый RowDefinition прежде, чем фактическое любой RowDefinition, мне нужно реорганизовать Grid.Row всех органов управленияКак установить Grid Row с именем RowDefinition?

Я видел RowDefinition и ColumnDefinition имеет свойство Name , поэтому думаю можно определить Grid.Row с RowDefinition имя или нет? Если это возможно, Как сделать

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Name="RowDictTitle" Height="27"/> 
     <RowDefinition Name="RowSearchWord" Height="27"/> 
     <RowDefinition/> 
     <RowDefinition Height="50"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"/> 
     <ColumnDefinition Width="2*"/> 
    </Grid.ColumnDefinitions> 

    <!--Row 1--> 
    <TextBlock Text="Word:" VerticalAlignment="Center" Margin="10,0,0,0" Grid.Row="1"/> 
    <TextBox Name="Search" Grid.ColumnSpan="2" Margin="50,2,10,2"/> 

    <!--Row 2--> 
    <ListBox Name="Words" Grid.Row="2" Margin="10"/> 
</Grid> 

Я хочу сделать ниже

<TextBlock Text="Word" Grid.Row="RowSearchWord"/> 

ответ

1

Хорошая идея, но так как Grid.Row вложенное свойство представляет собой целое число, это не представляется возможным.

См http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.row.aspx

Однако, возможно, можно создать помощник, который берет имя строки сетки, находит объект строки и возвращает его индекс строки.

6

Отказ от ответственности: Этот ответ является своеобразной саморекламой в пределах ограничений, на которые ссылается this meta post. Он рекламирует бесплатный проект с открытым исходным кодом, который я (на момент написания этого) не заработал. Единственный выигрыш - это знание того, что мое время для написания описанного элемента управления не было потрачено впустую, если оно помогает некоторым будущим посетителям этого вопроса SO.

У меня были точно такие же мысли. Вот почему, не так давно, я написал специальный класс grid, который использует именованные столбцы и строки.

Я положил его на Codeplex под лицензией MIT: Name-Based Grid project

С этим контролем, вы можете переписать исходный код Xaml следующим образом:

<nbg:NameBasedGrid> 
    <nbg:NameBasedGrid.RowDefinitions> 
     <nbg:ColumnOrRow Name="RowDictTitle" Height="27"/> 
     <nbg:ColumnOrRow Name="RowSearchWord" Height="27"/> 
     <nbg:ColumnOrRow Name="List"/> 
     <nbg:ColumnOrRow Height="50"/> 
    </nbg:NameBasedGrid.RowDefinitions> 
    <nbg:NameBasedGrid.ColumnDefinitions> 
     <nbg:ColumnOrRow Width="1*" Name="Left"/> 
     <nbg:ColumnOrRow Width="2*" Name="Right"/> 
    </nbg:NameBasedGrid.ColumnDefinitions> 

    <!--Row 1--> 
    <TextBlock Text="Word:" VerticalAlignment="Center" Margin="10,0,0,0" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="RowSearchWord"/> 
    <TextBox Name="Search" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="RowDictTitle" nbg:NameBasedGrid.ExtendToColumn="Right" Margin="50,2,10,2"/> 

    <!--Row 2--> 
    <ListBox Name="Words" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="List" Margin="10"/> 
</nbg:NameBasedGrid> 

Преимущества: Вы сможете ссылаться столбцы и строки (включая пробелы столбцов и строк!) по имени - больше не нужно подсчитывать столбцы или строки, при изменении макета больше не нужно обновлять столбцы или строки.

Недостаток: Вам нужно будет явно указывать имена для всех столбцов и строк, поскольку числовые ссылки вообще не поддерживаются в NameBasedGrid.

0

Я искал то же самое. Не удалось найти то, что я искал, поэтому я придумал свое решение, используя прилагаемые свойства.

Я создал специализированную сетку с прикрепленными свойствами для RowName и ColumnName. (В этом примере я реализована только RowName)

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

namespace GridNamedRows.CustomControl 
{ 
    public class MyGrid: Grid 
    { 
     public static readonly DependencyProperty RowNameProperty = 
       DependencyProperty.RegisterAttached(
         "RowName", 
         typeof(string), 
         typeof(MyGrid), 
         new FrameworkPropertyMetadata(
           "", 
           FrameworkPropertyMetadataOptions.AffectsParentArrange, 
           new PropertyChangedCallback(RowNameChanged)), 
         new ValidateValueCallback(IsStringNotNull)); 

     private static bool IsStringNotNull(object value) 
     { 
      return (value as string) != null; 
     } 

     private static void RowNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      if (e.NewValue == null) 
      { 
       return; 
      } 
      if (!(d is UIElement)) return; 
      Grid parent = ((FrameworkElement)d).Parent as Grid; 
      if (parent == null) return; 
      //Find rowname 
      for (int i = 0; i < parent.RowDefinitions.Count; i++) 
      { 
       if (parent.RowDefinitions[i].Name == e.NewValue.ToString()) 
       { 
        Grid.SetRow((UIElement)d, i); 
        break; 
       } 
      } 
     } 

     public static string GetRowName(DependencyObject target) 
     { 
      return (string)target.GetValue(RowNameProperty); 
     } 

     public static void SetRowName(DependencyObject target, string value) 
     { 
      target.SetValue(RowNameProperty, value); 
     } 
    } 
} 

Он может быть использован в XAML как это.

<Window xmlns:CustomControl="clr-namespace:GridNamedRows.CustomControl" x:Class="GridNamedRows.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <CustomControl:MyGrid> 
     <Grid.RowDefinitions> 
      <RowDefinition Name="firstRow"/> 
      <RowDefinition Name="secondRow"/> 
      <RowDefinition Name="thirdRow"/> 
     </Grid.RowDefinitions> 
     <TextBox Text="one" CustomControl:MyGrid.RowName="secondRow"/> 
     <TextBox Text="two" Grid.Row="2"/> 
     <TextBox Text="three" CustomControl:MyGrid.RowName="firstRow"/> 
    </CustomControl:MyGrid> 
</Window> 

Он не отображается правильно в дизайнере, но работает во время выполнения.

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