2014-11-28 4 views
1

XAML에서 코드 조각을 복사하여 링크 할 수있는 항목을 정의 할 수 있는지 궁금합니다.WPF에서 XAML 코드 재사용

<Grid> 

// Definitions 

<Label Content="Name:" /> 
<Label Content="Age:" Grid.Column="1"/> 
... 
<Grid> 

지금은 <Content_in_grid=nice_labels> 뭔가를하고 싶은 그것은 단순히이 라벨을 복사해야합니다 : 더 구체적으로, 내가 가진 것입니다.

알림 : 다른 속성으로 바인딩하려는 일부 레이블이기 때문에 격자가 필요하지 않습니다.

추신 : 다른 관점, WPF로 파일 속성 비교 프로그램을 만들고 싶습니다. 그래서 Filename, Date 등 정적 레이블을 다시 복사해야한다고 상상할 수 있지만, 유지 보수성을 위해 Filename을 File로 변경하려면 하나를 편집하는 대신 검색하고 교체해야합니다. 장소.

미리 감사드립니다.

<Window.Resources> 
    <DataTemplate x:Key="MyGrid"> 
     <Grid> 
      <Label Content="Name:" /> 
      <Label Content="Age:" Grid.Column="1" /> 
     </Grid> 
    </DataTemplate> 
</Window.Resources> 

을 그리고 당신이 원하는 경우 다음을 사용합니다 :

+1

이 직업은 정확히 'UserControl'의 존재 목적입니다 ... – Grx70

+0

http://stackoverflow.com/questions/24698833/re-using-ui-in-wpf-from-a- 리소스/24699350 # 24699350 –

답변

6

자원에 추가

<StackPanel> 
    <ContentPresenter ContentTemplate="{StaticResource MyGrid}" /> 
    <ContentPresenter ContentTemplate="{StaticResource MyGrid}" /> 
    <ContentPresenter ContentTemplate="{StaticResource MyGrid}" /> 
</StackPanel> 
+0

요소가 한 번에 한 곳에서만 존재할 수 있기 때문에이 기능이 작동하지 않는다고 생각합니다. 리소스는 한 번만 인스턴스화됩니다. –

+0

@RicoSuter : 시도해 보았지만 작동합니다. –

+0

하지만 돈이 없습니다. "그리드"태그, 레이블 태그 만 갖고 싶습니다.그래서 : '왜냐하면 제가 그리드를 이미 가지고 있기 때문에 제가 이것을했다면 그리드에 그리드가 생기지 않을까요? 당신이 – Snowflake

0

플랫 에릭의 대답은 거의 정확합니다.

내가 추가»x : Shared = "False"«그렇지 않으면 리소스를 한 번만 사용할 수 있었기 때문에 마지막 ContentPresenter에서만 볼 수있었습니다. (이것은 VisualStudio의 모든 ContentPresenter에서 볼 수 있지만 최종 응용 프로그램에서는 볼 수 없습니다).

추신 : 플랫 에릭이 대답을 편집하여 x : 더 이상 공유 할 필요가 없다는 것을 알았습니다. 어쨌든, 원래의 대답은 다음과 같이해야한다 :

<Grid x:Key="MyGrid" x:Shared="False" > 
     <Label Content="Name:"/> 
     <Label Content="Age:" Grid.Column="1"/> 
    </Grid> 
0
(당신이 파일 속성 비교 도구를 언급 당신이 항목 컬렉션을 기반으로 컨텐츠를하는 주형되어 설명된다

, 그래서 그것을이리스트가 될 수 있습니다 추측하고있다 파일 등록 정보).

당신은 현실에 Grid에 또 다시 Labels을 추가 할 것입니다,하지만 Binding 시스템 (귀하의 경우)를 HeaderedItemsControlDataGrid A와를 사용하여 당신을 위해 그것을 할 것입니다.

<DataGrid ItemsSource="{Binding FileProperties}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding PropertyName}" Header="Name:"/> 
      <DataGridTextColumn Binding="{Binding PropertyValue}" Header="Age:"/> 
     </DataGrid.Columns> 
    </DataGrid> 

NB : 일반적 PropertyNamePropertyValue 및 특성을 갖는 타입의 것이 될 ObservableCollection<T>ItemsSource에 사용 FileProperties.

ItemsControl과 일부 정적 XAML을 헤더에 사용하면 비슷한 효과를 얻을 수 있지만 전반적으로 훨씬 더 깔끔합니다.