2009-12-29 4 views
2

WPF로 응용 프로그램을 작성하고 있으며 그 중 일부는 사용자 정의 내부 장치를 구성하는 데 사용되는 다양한 파일을 관리합니다. 동일한 TabControl에서 여러 유형의 구성을 탭에서 조작 할 수 있어야합니다. 즉, TabItem의 내용을 동적으로 생성해야합니다. ControlTemplates를 사용하여이 작업을 수행하고 싶지만 작업 템플릿을 아직 성공적으로 가져 오지 못했습니다. 내 창 리소스에 정의 된 "pendantConfigurationTabItemTemplate"이라는 ControlTemplate이 있고 TabItems에 액세스해야하는 명명 된 항목이 들어있는 템플릿을 적용하고 부모 TabControl에 추가하려면 다음 코드를 사용합니다.WPF의 템플릿을 기반으로 런타임에 다른 내용으로 TabItem을 만듭니다.

<ControlTemplate x:Key="pendantConfigurationTabItemTemplate" TargetType="TabItem"> 
    <StackPanel Orientation="Vertical"> 
     <my:PendantConfigurationFileEditor x:Name="configurationEditor"/> 
     <StackPanel Style="{StaticResource defaultOkCancelButtonsContainerStyle}"> 
      <Button Style="{StaticResource defaultOkCancelButtonStyle}"/> 
      <Button Style="{StaticResource defaultOkCancelButtonStyle}" Click="OkButton_Click"/> 
     </StackPanel> 
    </StackPanel> 
</ControlTemplate> 
뒤에

코드 : 나는이 프로그램을 실행할 때마다

그러나
TabItem ConfigTab = new TabItem(); 

switch (ConfigFile.Device) 
{ 
    case DeviceType.PENDANT: 
{ 
    ControlTemplate TabTemplate = Resources["pendantConfigurationTabItemTemplate"] as ControlTemplate; 

    ConfigTab.Template = TabTemplate; 
    ConfigTab.ApplyTemplate(); 

    object Editor = TabTemplate.FindName("configurationEditor", ConfigTab); 

    PendantConfigurationFileEditor ConfigFileEditor = Editor as PendantConfigurationFileEditor; 

    ConfigFileEditor.PendantConfiguration = DeviceConfig; 

    break; 
} 
default: 
    /* snipped */ 
    return; 
} 

ConfigTab.Header = ConfigFile.ConfigurationName; 

this.EditorTabs.Items.Add(ConfigTab); 
this.EditorTabs.SelectedIndex = this.EditorTabs.Items.Count - 1; 

, 더 탭 대신 탭 컨트롤 (겉으로는) 교체 또는 템플릿의 내용이 적용됩니다, 탭 컨트롤에 추가되지 얻을. 누군가 제발 저를 도와주세요.

효과적으로, 내가 뭘 원하는

답변

5

TabControl.ItemsSource 플러스 DataTemplates 효과적으로 당신이 요구하는 "템플릿으로 공장"솔루션입니다 TabItem의 공장과 WPF 템플릿을 사용하지만, 그것은 현재에 약간 다른 접근 방식을 요구한다 하나.

TabItems를 만들고 템플릿을 작성하고 Items.Add를 호출하는 절차 코드를 작성하는 대신 ItemsSource 속성과 데이터 바인딩을 사용하십시오. 그러면 WPF가 ItemsSource의 각 개체에 대한 TabItem을 만듭니다. 그런 다음 ContentTemplateSelector를 사용하여 적절한 조건 (예 : Device 속성)에 따라이 탭에 표시된 객체에 적합한 템플릿을 선택할 수 있습니다.이 경우 ControlTemplates가 아닌 DataTemplates를 사용하게됩니다.

public class DeviceTypeSelector : DataTemplateSelector 
{ 
    public DataTemplate PendantTemplate { get; set; } 
    public DataTemplate DefaultTemplate { get; set; } 

    public override SelectTemplate(object item, DependencyObject container) 
    { 
    ConfigFile cf = (ConfigFile)item; 
    switch (cf.Device) 
    { 
     case DeviceType.Pendant: return PendantTemplate; 
     default: return DefaultTemplate; 
    } 
    } 
} 

과 같이 XAML에서 인스턴스화됩니다 :

당신의 선택은 다음과 같이 보일 것입니다

(PT와 DT는 자원의 다른 곳에서 정의 된 적절한 DataTemplates 있습니다)
<local:DeviceTypeSelector x:Key="dts" 
          PendantTemplate="{StaticResource pt}" 
          DefaultTemplate="{StaticResource dt}" /> 

.

<TabControl Name="EditorTabs" 
      ContentTemplateSelector="{StaticResource dts}" /> 

을 당신은 EditorTabs.ItemsSource = myConfigFiles;로 설정 (또는 더 나은 여전히 ​​DataContext를에서 XAML에서 ItemsSource를 획득하자) :

마지막으로, 당신을 TabControl은 다음과 같이됩니다.

또한 TabItem의 헤더를 설정해야합니다. 이렇게하려면 TabControl.ItemContainerStyle을 Header 속성의 Setter와 함께 사용하십시오.

<TabControl ...> 
    <TabControl.ItemContainerStyle> 
    <Style TargetType="TabItem"> 
     <Setter Property="Header" Value="{Binding ConfigurationName}" /> 
    </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

(당신은 또한 그런데, ContentTemplateSelector 인라인 할 수 있습니다 :. 작은 조각으로 사물을 보여주기 위해 주로 있도록 내가 자원으로 그것을 발발)

+0

가 있다고 나는이 다음과 같이 보일 것 같아 중대한 응답, 나는 그것을 쏜다. 그러나, 나는 DataTemplates 더 많은 데이터를 표시하기위한 의도와 ControlTemplates는 사용이 가능한 컨트롤로 사용하기 위해 만들어야 UserControls의 수를 줄이기 위해 의도되었다고 생각합니까?탭에 표시/데이터 바인딩되는 객체를 편집 할 수 있어야합니다. –

+0

두려워하지 마십시오. DataTemplates는 * 및 편집 * 데이터를 표시하기위한 것입니다. 그들은 표시되는 개체를 업데이트하는 UI 요소를 절대적으로 포함 할 수 있습니다. DataTemplate의 요소 바인딩이 양방향인지 확인하십시오 (이 컨트롤은 텍스트 상자의 기본값이지만 모든 컨트롤의 기본값은 아닙니다). ControlTemplates는 컨트롤의 UI를 변경하면서 기존 동작 (예 : Button을 일반적인 버튼 크롬없이 독립형 그래픽으로 표시하거나 TabControl을 캐 러셀, rolodex 또는 (노트북)으로 표시합니다. – itowlson

+0

귀하의 제안이 효과가있었습니다. 정말 고마워, 정말 고마워. :) –

관련 문제