2011-10-09 2 views
2

나는 동적으로 추가하기 위해 노력하고있어 CloseableTabItems와 CloseableTabControl 있습니다WPF의 탭 항목 : 지정된 요소는 이미 다른 요소의 논리적 하위입니다. 빼 처음

public class CloseableTabControl : TabControl 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new CloseableTabItem(); 
    } 
} 


public class CloseableTabItem : TabItem 
{ 
    public static readonly RoutedEvent CloseTabEvent = 
     EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), typeof(CloseableTabItem)); 

    public event RoutedEventHandler CloseTab 
    { 
     add { AddHandler(CloseTabEvent, value); } 
     remove { RemoveHandler(CloseTabEvent, value); } 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     var closeButton = Template.FindName("closeButton", this) as Button; 
     if (closeButton != null) 
     closeButton.Click += CloseButtonClick; 
    } 

    void CloseButtonClick(object sender, RoutedEventArgs e) 
    { 
     RaiseEvent(new RoutedEventArgs(CloseTabEvent, this)); 
    } 
} 

을 다음과 같이 XAML은 : 나는 단지 하나를 추가 해요 때

<local:CloseableTabControl Grid.Column="2" Grid.Row="1" SelectedIndex="{Binding SelectedTabIndex}" ItemsSource="{Binding TabItems}"> 
    <local:CloseableTabControl.Resources> 
     <DataTemplate DataType="{x:Type TestEditor:TestEditorViewModel}"> 
      <TestEditor:TestEditorView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type TestParameterEditor:TestParameterEditorViewModel}"> 
      <TestParameterEditor:TestParameterEditorView/> 
     </DataTemplate> 
    </local:CloseableTabControl.Resources> 
    <local:CloseableTabControl.ItemContainerStyle> 
     <Style TargetType="local:CloseableTabItem"> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabItem}"> 
        <Grid> 
         <Border Name="Border" Background="{DynamicResource Brush2}" BorderBrush="{DynamicResource Brush5}" BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" > 
          <DockPanel> 
           <ContentPresenter x:Name="ContentSite" 
            VerticalAlignment="Center" 
            HorizontalAlignment="Center" 
            ContentSource="Header" 
            Margin="12,2,12,2"/> 
           <Button Name="closeButton" 
            HorizontalAlignment="Center" 
            Margin="3,0,3,0" 
            VerticalAlignment="Center" 
            Width="16" 
            Height="16" 
            DockPanel.Dock="Right" 
            Style="{DynamicResource CloseableTabItemButtonStyle}" 
            ToolTip="Close Tab"> 
            <Path Stretch="Fill" StrokeThickness="0.5" Stroke="#FF333333" Fill="#FF969696" Data="F1 M 2.28484e-007,1.33331L 1.33333,0L 4.00001,2.66669L 6.66667,6.10352e-005L 8,1.33331L 5.33334,4L 8,6.66669L 6.66667,8L 4,5.33331L 1.33333,8L 1.086e-007,6.66669L 2.66667,4L 2.28484e-007,1.33331 Z " HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
           </Button> 
          </DockPanel> 
         </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter TargetName="Border" Property="Background" Value="{DynamicResource lightBrush}" /> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="False"> 
           <Setter TargetName="Border" Property="Background" Value="{DynamicResource Brush1}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Header"> 
       <Setter.Value> 
        <StackPanel Orientation="Horizontal" ToolTip="{Binding Caption}"> 
         <Image Height="18" Source="{Binding ImageName}"/> 
         <TextBlock Text="{Binding Title}" Margin="2,0,0,0"/> 
        </StackPanel> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     </local:CloseableTabControl.ItemContainerStyle> 
    </local:CloseableTabControl> 

다 괜찮습니다 이 윈도우의 뷰 모델의 생성자 탭 :

TabItems.Add(TestEditorViewModel); 

그러나 나는 내가 언급 한 예외를 받고 있어요 하나 이상을 추가 해요.
here 지침을 따르고 XAML을 ItemTemplateContentTemplate으로 분리하려고 시도했지만 이로 인해 이 발생했습니다 (그 이유는 템플릿의 ContentPresenter 부분 때문입니다. 이유는 없습니다).
아이디어를 얻으려면 어떻게해야합니까?
감사

답변

4

Header 속성에 문제가 있습니다. 첫 번째 TabItemStyle이 적용되면 새 StackPanel이 생성됩니다. 두 번째 TabItem이 생성되고 Style이 적용된 경우 과 같은StackPanelHeader 속성에 할당됩니다. WPF에서 비주얼은 부모가 하나뿐이므로 위의 명시된 예외가 표시됩니다. 대신 각 시간 StyleTabItem 적용되도록 StackPanel를 포함하는 HeaderTemplate을 정의해야 새로운 WPF는 HeaderTemplate을 팽창 할 때 StackPanel가 생성됩니다.

이 관련 게시물을 참조하십시오

WTF WPF TabControl?

건배!

+0

나는 우리가 거의 같은 시간에 대답했다고 생각한다. –

+2

나는이 오류를 여러 사람들에게 똑같은 쿠키를 먹는 것과 비슷하다고 항상 생각했다. 그것은 단지 작동하지 않습니다. 당신은 그 (것)들을 위해 그들 자신의 과자를 만들기 위하여 그 (것)들을위한 과자 레시피 (템플렛)를 그 (것)들에게 대신 줄 필요가있다 :) – Rachel

+0

중대한 유례는, 당신이 그것을 빌려 주면 당신이 꺼리지 않을 것이라는 점을 희망한다! –

2

이 문제는 스타일 내부

<Setter Property="Header"> 
    <Setter.Value> 
     <StackPanel Orientation="Horizontal" ToolTip="{Binding Caption}"> 
      <Image Height="18" Source="{Binding ImageName}"/> 
      <TextBlock Text="{Binding Title}" Margin="2,0,0,0"/> 
     </StackPanel> 
    </Setter.Value> 
</Setter> 

했다. 나는 정확히, 나는 그것이 어떤 이유로 두 번 설정되는 내용이라고 생각 원인이 무엇인지 잘 모르겠지만,이 솔루션은 정확히 문제가 가장 환영받을 것입니다 무엇인지에

<local:CloseableTabControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" ToolTip="{Binding Caption}"> 
       <Image Height="18" Source="{Binding ImageName}"/> 
       <TextBlock Text="{Binding Title}" Margin="2,0,0,0"/> 
     </StackPanel> 
    </DataTemplate> 
</local:CloseableTabControl.ItemTemplate> 

모든 설명을 사용하는 것입니다.

관련 문제