표의 각 행과 열의 이름을 지정하면 컨트롤의 grid.row = "Row_Top"을 설정할 수 있습니까? 그것을 언급하기 위해 StaticResources를 정의했지만 리소스가 없으면이 작업을 수행하는 변환기 또는 다른 메서드가 있습니까?XAML : 그리드 행 또는 열을 이름으로 참조 할 수 있습니까?
2
A
답변
6
내가 아는 한 그것을 할 수있는 방법은 기본적으로 그러나, 당신은 그것의 이름으로 행 또는 열을 검색하기 위해 마크 업 확장을 사용할 수 ... 없습니다 :
[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" />
감사합니다. Thomas, 뛰어난 답변! – Brad