如何体格化网格 ColumnDefinitions 在 WPF

我想知道如何如何体程化网格,以便我不需要点


<grid.columndefinitions>
<columndefinition sharedsizegroup="SG1" width="auto"></columndefinition>
<columndefinition sharedsizegroup="SG2" width="auto"></columndefinition>
</grid.columndefinitions>


每次?

非常感谢!

ps: 首先我试图搜索 Google. 但我找不到任何答案。 任何会找到答案的人 google, 你能告诉我你用来搜索什么关键字吗? 有时我很难确定要搜索的关键字。

ps2: 我懒得太懒了,每次我都开了 chrome, 我正在输入一些东西并寻找。 如果没有找到任何东西,我得出结论,没有任何东西被发现,我来到这里。 有没有人会寻找 Google, 然后它找不到任何东西,那么它将打开 bing.com 并会寻找? 找不到任何东西,然后去 yahoo, 寻找并寻找?.....
已邀请:

喜特乐

赞同来自:

我总是不愉快地写作
RowDefinitions


ColumnDefinitions

, 所以有一天,我厌倦了这个并写了一些
http://rachel53461.wordpress.c ... ties/
, 这可以用于这种东西。

现在而不是写下我的定义
Grid

像这样:


<grid>
<grid.rowdefinitions>
<rowdefinition height="Auto"></rowdefinition>
<rowdefinition height="Auto"></rowdefinition>
<rowdefinition height="Auto"></rowdefinition>
<rowdefinition height="Auto"></rowdefinition>
<rowdefinition height="Auto"></rowdefinition>
<rowdefinition height="*"></rowdefinition>
</grid.rowdefinitions>
<grid.columndefinitions>
<columndefinition width="Auto"></columndefinition>
<columndefinition width="*"></columndefinition>
<columndefinition width="Auto"></columndefinition>
<columndefinition width="*"></columndefinition>
</grid.columndefinitions>
</grid>


我可以用


<grid local:gridhelpers.columncount="4" local:gridhelpers.rowcount="6" local:gridhelpers.starcolumns="1,3" local:gridhelpers.starrows="5">
</grid>


他只允许维度
Auto


*

, 但大多数时候都是我所用的。

它还支持动态网格的绑定


<grid local:gridhelpers.columncount="{Binding ColumnCount}" local:gridhelpers.rowcount="{Binding RowCount}"></grid>


这是代码的副本,以防这个网站失败了 :


public class GridHelpers
{
#region RowCount Property

/// <summary>
/// Adds the specified number of Rows to RowDefinitions.
/// Default Height is Auto
/// </summary>
public static readonly DependencyProperty RowCountProperty =
DependencyProperty.RegisterAttached/
"RowCount", typeof/int/, typeof/GridHelpers/,
new PropertyMetadata/-1, RowCountChanged//;

// Get
public static int GetRowCount/DependencyObject obj/
{
return /int/obj.GetValue/RowCountProperty/;
}

// Set
public static void SetRowCount/DependencyObject obj, int value/
{
obj.SetValue/RowCountProperty, value/;
}

// Change Event - Adds the Rows
public static void RowCountChanged/
DependencyObject obj, DependencyPropertyChangedEventArgs e/
{
if /!/obj is Grid/ || /int/e.NewValue < 0/
return;

Grid grid = /Grid/obj;
grid.RowDefinitions.Clear//;

for /int i = 0; i < /int/e.NewValue; i++/
grid.RowDefinitions.Add/
new RowDefinition// { Height = GridLength.Auto }/;

SetStarRows/grid/;
}

#endregion

#region ColumnCount Property

/// <summary>
/// Adds the specified number of Columns to ColumnDefinitions.
/// Default Width is Auto
/// </summary>
public static readonly DependencyProperty ColumnCountProperty =
DependencyProperty.RegisterAttached/
"ColumnCount", typeof/int/, typeof/GridHelpers/,
new PropertyMetadata/-1, ColumnCountChanged//;

// Get
public static int GetColumnCount/DependencyObject obj/
{
return /int/obj.GetValue/ColumnCountProperty/;
}

// Set
public static void SetColumnCount/DependencyObject obj, int value/
{
obj.SetValue/ColumnCountProperty, value/;
}

// Change Event - Add the Columns
public static void ColumnCountChanged/
DependencyObject obj, DependencyPropertyChangedEventArgs e/
{
if /!/obj is Grid/ || /int/e.NewValue < 0/
return;

Grid grid = /Grid/obj;
grid.ColumnDefinitions.Clear//;

for /int i = 0; i < /int/e.NewValue; i++/
grid.ColumnDefinitions.Add/
new ColumnDefinition// { Width = GridLength.Auto }/;

SetStarColumns/grid/;
}

#endregion

#region StarRows Property

/// <summary>
/// Makes the specified Row's Height equal to Star.
/// Can set on multiple Rows
/// </summary>
public static readonly DependencyProperty StarRowsProperty =
DependencyProperty.RegisterAttached/
"StarRows", typeof/string/, typeof/GridHelpers/,
new PropertyMetadata/string.Empty, StarRowsChanged//;

// Get
public static string GetStarRows/DependencyObject obj/
{
return /string/obj.GetValue/StarRowsProperty/;
}

// Set
public static void SetStarRows/DependencyObject obj, string value/
{
obj.SetValue/StarRowsProperty, value/;
}

// Change Event - Makes specified Row's Height equal to Star
public static void StarRowsChanged/
DependencyObject obj, DependencyPropertyChangedEventArgs e/
{
if /!/obj is Grid/ || string.IsNullOrEmpty/e.NewValue.ToString////
return;

SetStarRows//Grid/obj/;
}

#endregion

#region StarColumns Property

/// <summary>
/// Makes the specified Column's Width equal to Star.
/// Can set on multiple Columns
/// </summary>
public static readonly DependencyProperty StarColumnsProperty =
DependencyProperty.RegisterAttached/
"StarColumns", typeof/string/, typeof/GridHelpers/,
new PropertyMetadata/string.Empty, StarColumnsChanged//;

// Get
public static string GetStarColumns/DependencyObject obj/
{
return /string/obj.GetValue/StarColumnsProperty/;
}

// Set
public static void SetStarColumns/DependencyObject obj, string value/
{
obj.SetValue/StarColumnsProperty, value/;
}

// Change Event - Makes specified Column's Width equal to Star
public static void StarColumnsChanged/
DependencyObject obj, DependencyPropertyChangedEventArgs e/
{
if /!/obj is Grid/ || string.IsNullOrEmpty/e.NewValue.ToString////
return;

SetStarColumns//Grid/obj/;
}

#endregion

private static void SetStarColumns/Grid grid/
{
string[] starColumns =
GetStarColumns/grid/.Split/','/;

for /int i = 0; i < grid.ColumnDefinitions.Count; i++/
{
if /starColumns.Contains/i.ToString////
grid.ColumnDefinitions[i].Width =
new GridLength/1, GridUnitType.Star/;
}
}

private static void SetStarRows/Grid grid/
{
string[] starRows =
GetStarRows/grid/.Split/','/;

for /int i = 0; i < grid.RowDefinitions.Count; i++/
{
if /starRows.Contains/i.ToString////
grid.RowDefinitions[i].Height =
new GridLength/1, GridUnitType.Star/;
}
}
}

三叔

赞同来自:

这是一个不需要任何辅助类的解决方案。

可以安装 ColumnDefinitions, 使用 ItemsControl 用网格 ItemsPanelTemplate. 这在下面的示例中显示。


<itemscontrol>
<itemscontrol.resources>
<style targettype="ItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="40" />
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</style>
</itemscontrol.resources>
<textbox text="First column"></textbox>
<textbox grid.column="1" text="second column"></textbox>
</itemscontrol>

冰洋

赞同来自:

创建投入属性配置更改以同步集合的元素:


<grid>
<grid.style>
<style targettype="Grid">
<Setter Property="my:GridUtils.ColumnDefinitions">
<Setter.Value>
<my:ColumnDefinitionCollection>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</my:ColumnDefinitionCollection>
</Setter.Value>
</Setter>
</style>
</grid.style>
<button content="Button"></button>
<button content="Button" grid.column="1"></button>
</grid>


销售量 /支持 RowDefinition 省略因为它主要是相同的/:


public class GridUtils
{
public static readonly DependencyProperty ColumnDefinitionsProperty =
DependencyProperty.RegisterAttached/"ColumnDefinitions", typeof /ColumnDefinitionCollection/,
typeof /GridUtils/,
new PropertyMetadata/default/ColumnDefinitionCollection/,
OnColumnDefinitionsChanged//;

private static void OnColumnDefinitionsChanged/DependencyObject d, DependencyPropertyChangedEventArgs ev/
{
var grid = /Grid/ d;
var oldValue = /ColumnDefinitionCollection/ ev.OldValue;
var newValue = /ColumnDefinitionCollection/ ev.NewValue;
grid.ColumnDefinitions.Clear//;
if /newValue != null/
foreach /var cd in newValue/
grid.ColumnDefinitions.Add/cd/;
}

public static void SetColumnDefinitions/Grid element, ColumnDefinitionCollection value/
{
element.SetValue/ColumnDefinitionsProperty, value/;
}

public static ColumnDefinitionCollection GetColumnDefinitions/Grid element/
{
return /ColumnDefinitionCollection/ element.GetValue/ColumnDefinitionsProperty/;
}
}

public class ColumnDefinitionCollection : List<columndefinition> {}


</columndefinition>

奔跑吧少年

赞同来自:

我相信这是不可能的,因为你无法安装影响一切的样式 ColumnDefinition/S./.

网格不支持 ControlTemplate, 因此,您不能与组合物的组成进行。

我可以想到的唯一黑客 - 这是如何使用这些创建自定义控件 2 列并展开网格。 但这很恶心。

喜特乐

赞同来自:

像这样:

1/ 使用类似于此的附加属性创建一个集合:


public class ColumnDefinitions : Collection<columndefinition>
{
public static readonly DependencyProperty SourceProperty = DependencyProperty.RegisterAttached/
"Source",
typeof/ColumnDefinitions/,
typeof/ColumnDefinitions/,
new PropertyMetadata/
default/ColumnDefinitions/,
OnColumnDefinitionsChanged//;

public static void SetSource/Grid element, ColumnDefinitions value/
{
element.SetValue/SourceProperty, value/;
}

[AttachedPropertyBrowsableForChildren/IncludeDescendants = false/]
[AttachedPropertyBrowsableForType/typeof/Grid//]
public static ColumnDefinitions GetSource/Grid element/
{
return /ColumnDefinitions/element.GetValue/SourceProperty/;
}

private static void OnColumnDefinitionsChanged/DependencyObject d, DependencyPropertyChangedEventArgs e/
{
var grid = /Grid/d;
grid.ColumnDefinitions.Clear//;
var columnDefinitions = /ColumnDefinitions/e.NewValue;
if /columnDefinitions == null/
{
return;
}

foreach /var columnDefinition in columnDefinitions/
{
grid.ColumnDefinitions.Add/columnDefinition/;
}
}
}


2/ 然后,您可以将其用作资源和如此网格样式,如下所示:

请注意,您需要使用
x:Shared="False"

. 如果没有,则会将相同的定义添加到诸多网格中 WPF 扔。


<usercontrol.resources>
<demo:columndefinitions x:key="SomeColumnDefinitions" x:shared="False">
<columndefinition width="Auto"></columndefinition>
<columndefinition width="*"></columndefinition>
</demo:columndefinitions>
<style targettype="{x:Type Grid}" x:key="SomeGridStyle">
<Setter Property="demo:ColumnDefinitions.Source" Value="{StaticResource SomeColumnDefinitions}"></Setter>
</style>
</usercontrol.resources>
<grid>
<grid.rowdefinitions>
<rowdefinition></rowdefinition>
<rowdefinition height="5"></rowdefinition>
<rowdefinition></rowdefinition>
</grid.rowdefinitions>
<grid style="{StaticResource SomeGridStyle}">
<rectangle fill="Blue" grid.column="0" grid.row="0" width="120"></rectangle>
<rectangle fill="Yellow" grid.column="1" grid.row="0"></rectangle>
</grid>
<grid grid.row="2" style="{StaticResource SomeGridStyle}">
<rectangle fill="Blue" grid.column="0" grid.row="0" width="120"></rectangle>
<rectangle fill="Yellow" grid.column="1" grid.row="0"></rectangle>
</grid>
</grid>


</columndefinition>

要回复问题请先登录注册