グリッド内の各行と列に名前を付ける場合、コントロールのgrid.row = "Row_Top"を設定できますか?それを参照するようにStaticResourcesを定義しましたが、リソースなしでこれを実現するためのコンバーターまたはその他の方法はありますか?
2169 次
1 に答える
10
私の知る限り、これを行うための組み込みの方法はありません...ただし、マークアップ拡張機能を使用して、その名前で行または列を取得できます。
[MarkupExtensionReturnType(typeof(int))]
public abstract class GridBandExtensionBase : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (serviceProvider != null)
{
var target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
var obj = target.TargetObject as DependencyObject;
if (obj != null)
{
var grid = VisualTreeHelper.GetParent(obj) as Grid;
if (grid != null)
{
return GetBandIndex(grid);
}
}
}
}
return 0;
}
protected abstract int GetBandIndex(Grid grid);
}
public class GridRowExtension : GridBandExtensionBase
{
public GridRowExtension() {}
public GridRowExtension(string rowName)
{
this.RowName = rowName;
}
[ConstructorArgument("rowName")]
public string RowName { get; set; }
protected override int GetBandIndex(System.Windows.Controls.Grid grid)
{
for (int i = 0; i < grid.RowDefinitions.Count; i++)
{
if (grid.RowDefinitions[i].Name == RowName)
{
return i;
}
}
return 0;
}
}
public class GridColumnExtension : GridBandExtensionBase
{
public GridColumnExtension() {}
public GridColumnExtension(string columnName)
{
this.ColumnName = columnName;
}
[ConstructorArgument("columnName")]
public string ColumnName { get; set; }
protected override int GetBandIndex(System.Windows.Controls.Grid grid)
{
for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
{
if (grid.ColumnDefinitions[i].Name == ColumnName)
{
return i;
}
}
return 0;
}
}
次に、これらの拡張機能を次のように使用できます。
<Button Grid.Row="{my:GridRow Row_Top}"
Grid.Column="{my:GridColumn Column_Right}"
Content="Hello world" />
注:これらのマークアップ拡張機能をアプリケーションと同じアセンブリでコンパイルすると、デザイナーはパラメーターを使用してコンストラクターを呼び出すことができなくなります(ただし、実行時には正常に機能します)。これは、Microsoftが修正する予定のない既知のバグです。設計時に機能させる場合は、次のように、マークアップ拡張機能を別のアセンブリに配置するか、RowName/ColumnNameプロパティを明示的に指定します。
<Button Grid.Row="{my:GridRow RowName=Row_Top}"
Grid.Column="{my:GridColumn ColumnName=Column_Right}"
Content="Hello world" />
于 2010-02-02T11:23:04.417 に答える