2009-03-30 12 views
1

나는이 두 가지 컨트롤 (WPFToolkit 및 표준 툴바의 DataGrid)을 만드는 것과 같은 작업을했습니다. 대규모로, 노동 조합이 어떤 것을 통제하는지는 중요하지 않습니다. 필요한 것을 구축하는 데 사용할 수있는 일반적인 관행을 찾아야합니다. 언뜻 보면 사용자 컨트롤, 즉 컨트롤의 구성과 같은 것이 필요합니다. 즉 전체적으로 구현하고 다시 사용할 수 있어야합니다. 하지만 제 작업에서는 XAML에서 복합 컨트롤을 조정할 수 있어야합니다. 그래서 툴바와 DataGrid를 구성하면 두 속성과 이벤트가 노출되기를 원합니다. 그래서 예를 들어, 모두 XAML에 설정할 수, 데이터 그리드의 열 및 도구 모음의 바 :사용자 정의/사용자 컨트롤

(loacal 파서가 어떤 이유를 입력하지 않았기 때문에 내가 의도적으로 태그 이름에 공백을 넣어)

<MyDataGridToolBarControl> 
<DataGrid> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="firstColumn"> 
      </DataGridTextColumn> 
      <DataGridTextColumn Header="secondColumn"/> 
     </DataGrid.Columns> 
</DataGrid> 
<ToolBar Background="{x:Null}"> 
     <Button ToolTip="New"> 
      <Image Source="New.png"/> 
     </Button> 
     <Button ToolTip="Save"> 
      <Image Source="Save.png"/> 
     </Button> 
     <Button ToolTip="Delete"> 
      <Image Source="Delete.png"/> 
     </Button>    
</ToolBar> 
</MyDataGridToolBarControl> 

나에게 적합하지 않은 유일한 결정은 Datarid에서 상속 된 사용자 지정 컨트롤을 만들고 (이 쌍에서 DataGrid가 더 중요한 것처럼) DataGrid와 도구 모음을 모두 포함하는 Template를 다시 정의하는 것입니다. 이렇게하면 DataGrid의 모든 기능을 사용할 수 있습니다. 툴바 부분을 얻으려면 코드를 통해 수행해야합니다. 즉, 가상적이고 논리적 인 트리를 찾아야합니다. 즉 프로그래밍 방식으로 접근하는 것입니다. 이 과제를 해결하기 위해 초보자를 도와주세요.) 미리 감사드립니다 ...

답변

1

바깥의 사용자가 Xaml을 통해 툴바의 모든 속성과 모든 속성에 액세스하려는 경우 이 같은 두 개의 컨트롤을 UserControl이를 만들고 노출 될 수 :

<UserControl> 

    <StackPanel> 
     <ToolBar x:Name="ToolBar" x:FieldModifier="Public" /> 
     <DataGrid x:Name="Grid" x:FieldModifier="Public" />   
    </StackPanel> 

<UserControl> 

이 방법의 문제는 사용자 컨트롤이기 때문에 사용자가 그리드 및 도구 모음의 레이아웃을 무시할 수 없다는 점이다. 그러나 툴바와 그리드의 템플릿과 스타일을 완전히 무시할 수 있습니다.

약간 더 나은 방법은 사용자 지정 컨트롤 (다시 composition을 사용하여)을 만드는 것입니다. 템플릿과 같이 그리드와 툴바를 다음과 같이 템플릿으로 제공 할 수 있습니다.

<ControlTemplate> 
     <StackPanel> 
      <ToolBar x:Name="PART_ToolBar" /> 
      <DataGrid x:Name="PART_Grid" />   
     </StackPanel> 
</ControlTemplate> 

[TemplatePart("PART_ToolBar", typeof(ToolBar))] 
[TemplatePart("PART_Grid", typeof(DataGrid))] 
public class MyCustomControl : Control 
{ 
    private ToolBar _ToolBar; 
    public ToolBar ToolBar {get{return _ToolBar;}} 

    private DataGrid _Grid; 
    public DataGrid Grid {get{return _Grid;}} 

    protected overrides OnApplyTemplate() 
    { 
     _ToolBar = this.Template.FindName("PART_ToolBar", this) as ToolBar; 
     _Grid = this.Template.FindName("PART_Grid", this) as DataGrid; 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 지금이 방법을 구현하려고 노력하고 있습니다. 이벤트에 대해서? 이 방법을 사용하여 네이티브 툴바와 그리드를 처리 할 수 ​​있습니까? –

+0

Grid 또는 ToolBar가 외부에 노출되어있는 경우 (두 경우 모두 있음) 직접 인스턴스화 한 것처럼 원하는 모든 것을 수행 할 수 있습니다. 물론 이것으로 캡슐화가 중단되고 소비자가 컨트롤에 뭔가 이상한 점이 발생할 수 있습니다. – Micah

+0

두 가지 방법으로 구현 된 DataGrid를 사용하여 전자 메일로 샘플 프로젝트를 보내면됩니다. 내부 툴바 및 사용자 정의 xaml 스타일을 사용하는 DataGrid의 속성? 너 정말 기쁠거야? 내가 말했듯이 XAML –

관련 문제