XAML TabControl의 탭 탭의 컨텐츠 영역에 탭 헤더가 표시되는 이유는 무엇입니까?
-
22-07-2019 - |
문제
나는 가지고있다 Tabcontrol 누구의 항목 소스에 묶여 있습니다 관찰 가능한 견해 모음 (USERCONTROLS) 각각의 루트 요소 A tabitem. 그러나 그것이 표시되면 헤더 텍스트는 마치 마치 마치 각 tabitem의 내용에 있습니다. Usercontrol 래퍼는 충돌을 일으키고 있습니다.
TabControl이 있습니다 SmartFormView.xaml :
<UserControl x:Class="TestApp.Views.SmartFormView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel
Margin="10">
<TextBlock Text="{Binding Title}"
FontSize="18"/>
<TextBlock Text="{Binding Description}"
FontSize="12"/>
<TabControl
Margin="0 10 0 0"
ItemsSource="{Binding SmartFormAreaViews}"/>
</StackPanel>
</UserControl>
tabitems가 tabcontrol 내부에 tabitems로 표시되도록 무엇을 변경해야합니까?
다음은 Tabitem 뷰가 호출됩니다 smartformareaview.xaml :
<UserControl x:Class="TestApp.Views.SmartFormAreaView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TabItem Header="This is the header">
<StackPanel Margin="10">
<TextBlock Text="this is the content"/>
</StackPanel>
</TabItem>
</UserControl>
그리고 여기 각보기를 만들고로드하는 곳은 다음과 같습니다. 관측형 수집:
var areas = from area in xmlDoc.Descendants("area")
select area;
foreach (var area in areas)
{
SmartFormArea smartFormArea = new SmartFormArea();
smartFormArea.IdCode = area.Attribute("idCode").Value;
smartFormArea.Title = area.Attribute("title").Value;
SmartFormAreaPresenter smartFormAreaPresenter = new SmartFormAreaPresenter(smartFormArea);
SmartFormAreaViews.Add(smartFormAreaPresenter.View as SmartFormAreaView);
}
해결책
항목 통제의 경우 항목 컬렉션에 추가 된 항목 (직접 또는 ItemsSource를 통해)이 해당 컨트롤의 항목 컨테이너 인스턴스가 아닌 경우 각 항목은 항목 컨테이너 인스턴스로 래핑됩니다. 항목 컨테이너는 tabitem 또는 listboxitem과 같은 클래스입니다. 항목 컨테이너는 일반적으로 ContentControl 또는 HeaderEdContentControl이며 실제 항목은 컨텐츠 속성에 할당되므로 템플릿 등을 사용하여 컨텐츠 제시 방법을 제어 할 수 있습니다. ItemControl의 ItemContainerstyle 속성을 사용하여 항목 컨테이너 자체를 스타일링 할 수도 있습니다.
이 특별한 경우, ItemsSource를 SmartFormareApresenters 목록에 바인딩해야합니다. 그런 다음 탭 컨트롤을 위해 이와 같은 것을 사용하십시오.
<TabControl ItemsSource="{Binding SmartFormAreaPresenters}">
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding HeaderText}" />
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type local:SmartFormAreaPresenter}">
<local:SmartFormAreaView />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
여기서 HeaderText는 SmartFormareApresenter의 적합한 속성입니다. 또한 SmartFormAreaView 정의에서 Tabitem을 제거해야합니다. 각보기의 데이터 컨텍스트는 자동으로 해당 발표자에게 설정됩니다.
WPF 박사를 참조하십시오 블로그 다양한 Itemscontrol 관련 주제에 대한 훌륭한 토론을 위해.
다른 팁
그만큼 TabControl
캐스트 될 수있는 경우에만 컨트롤을 통제로 받아 들일 것입니다. TabItem
, usercontrol 또는 smartformareaview 등이 아닙니다.
그래서 당신은 정기적으로 채 웁니다 TabItems
시각적 트리 또는 서브 클래스로 TabItems
, 또는 하위 클래스 TabControl
그것들을 무시합니다 IsItemItsOwnContainerOverride
방법, 유형을 컨테이너로 받아들입니다.
이 방법은 다음과 같이 보일 것입니다.
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is YourControlTypeHere || item is TabItem;
}