나는 동적으로 추가하기 위해 노력하고있어 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을 ItemTemplate
및 ContentTemplate
으로 분리하려고 시도했지만 이로 인해 이 발생했습니다 (그 이유는 템플릿의 ContentPresenter
부분 때문입니다. 이유는 없습니다).
아이디어를 얻으려면 어떻게해야합니까?
감사
나는 우리가 거의 같은 시간에 대답했다고 생각한다. –
나는이 오류를 여러 사람들에게 똑같은 쿠키를 먹는 것과 비슷하다고 항상 생각했다. 그것은 단지 작동하지 않습니다. 당신은 그 (것)들을 위해 그들 자신의 과자를 만들기 위하여 그 (것)들을위한 과자 레시피 (템플렛)를 그 (것)들에게 대신 줄 필요가있다 :) – Rachel
중대한 유례는, 당신이 그것을 빌려 주면 당신이 꺼리지 않을 것이라는 점을 희망한다! –