2010-02-02 6 views

답변

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" /> 
+0

감사합니다. Thomas, 뛰어난 답변! – Brad