2
如果我在網格中命名每行和每列,我可以設置控件的grid.row =「Row_Top」嗎?我已經定義了StaticResources來引用它,但有沒有一個轉換器或其他方法來完成這個沒有資源?XAML:我可以通過名稱引用網格行或列嗎?
如果我在網格中命名每行和每列,我可以設置控件的grid.row =「Row_Top」嗎?我已經定義了StaticResources來引用它,但有沒有一個轉換器或其他方法來完成這個沒有資源?XAML:我可以通過名稱引用網格行或列嗎?
據我知道有沒有內置的方式做到這一點......但是,你可以使用標記擴展其名稱檢索的行或列:
[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不打算修復的known bug。如果你想讓它在設計時的工作,把標記擴展在單獨的程序或明確指定RowName /的ColumnName屬性,如下所示:
<Button Grid.Row="{my:GridRow RowName=Row_Top}"
Grid.Column="{my:GridColumn ColumnName=Column_Right}"
Content="Hello world" />
感謝托馬斯,優秀的答案! – Brad 2010-02-02 11:42:12