لماذا التبويب رؤوس عرض في منطقة المحتوى من علامات التبويب في XAML TabControl?

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

سؤال

لدي TabControl الذي ItemsSource لا بد أن ملحوظة مجموعة من وجهات النظر (UserControls) كل الذي يكون الجذر عنصر تابيتيم.ومع ذلك ، عندما يتم عرض ، رأس النص في محتوى كل تابيتيم ، كما لو 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 يتم عرض TabItems داخل TabControl?

وهنا تابيتيم آراء يسمى 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>

و هنا أين يمكنني إنشاء وتحميل كل عرض في ObservableCollection:

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);
}
هل كانت مفيدة؟

المحلول

أي ItemsControl ، إذا كانت العناصر التي تضاف إلى مجموعة العناصر (إما مباشرة أو عبر ItemsSource) لا مثيل التي تتحكم في البند وعاء ، ثم كل عنصر ملفوفة في مثيل من عنصر الحاوية.البند حاوية فئة مثل تابيتيم أو 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 التعريف.على DataContext كل رأي سيتم تلقائيا تعيين المناسبة مقدم.

يرى الدكتورب 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