XAML TabControl의 탭 탭의 컨텐츠 영역에 탭 헤더가 표시되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1226622

문제

나는 가지고있다 Tabcontrol 누구의 항목 소스에 묶여 있습니다 관찰 가능한 견해 모음 (USERCONTROLS) 각각의 루트 요소 A tabitem. 그러나 그것이 표시되면 헤더 텍스트는 마치 마치 마치 각 tabitem의 내용에 있습니다. Usercontrol 래퍼는 충돌을 일으키고 있습니다.

alt text

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top