Как я могу получить кнопку закрытия на шаблонной TabItem в WPF?



У меня есть TabControl, где TabItem s-это DataTemplat ed. Шаблон, кажется, работает правильно, в том, что usercontrol, который я хочу показать в TabItem, показывает правильно.



В чем я не уверен, так это в том, как заставить "x" появиться в TabItem, чтобы я мог закрыть каждую вкладку, так как они динамически генерируются через шаблон.



Будучи довольно новичком в WPF, я начинаю понимать многие концепции, но TabControl доставил мне много хлопот, поэтому у меня вполне может быть шаблон работоспособный, но не ремонтопригодный.

Это то, что у меня есть, и я хотел бы иметь возможность закрыть каждый TabControl. Мне также нужно будет иметь возможность запускать пользовательское событие, когда это TabControl закрыто.

<UserControl x:Class="Russound.Windows.UI.UserControls.CallLog.CaseReaderWpf"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CallLog="clr-namespace:Russound.Windows.UI.UserControls.CallLog"
Height="637" Width="505">

<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Russound.Windows;component/UI/RussoundDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

<TabControl x:Name="tabCases" >
<TabControl.ItemTemplate>
<DataTemplate DataType="{x:Type TabItem}">
<StackPanel>
<TextBlock Text="{Binding Path=Id}" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type TabItem}">
<CallLog:CaseReadOnlyDisplay DataContext="{Binding}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</UserControl>
657   5  

5 ответов:

Ознакомьтесь с этой статьей Джоша Смита в MSDN. Это отличное решение для вашего вопроса.

Приложения WPF с шаблоном дизайна Model-View-ViewModel

Http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

<!-- 
This template explains how to render 
a tab item with a close button.
-->
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
  <Button 
    Command="{Binding Path=CloseCommand}"
    Content="X"
    Cursor="Hand"
    DockPanel.Dock="Right"
    Focusable="False"
    FontFamily="Courier" 
    FontSize="9"
    FontWeight="Bold"  
    Margin="0,1,0,0"
    Padding="0"
    VerticalContentAlignment="Bottom"
    Width="16" Height="16" 
    />
  <ContentPresenter 
    Content="{Binding Path=DisplayName}" 
    VerticalAlignment="Center" 
    />
</DockPanel>
</DataTemplate>

<!--
This template explains how to render the 'Workspace' content area in the main window.
-->
<DataTemplate x:Key="WorkspacesTemplate">
<TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />
</DataTemplate>

Вам придется создать собственный элемент управления tab. поиск google показывает много результатов, многие из них с исходным кодом, так что вам не придется заново создавать колесо.

Джош Смит написал статью для журнала MSDN с рабочим примером элементов tab, которые имеют кнопки закрытия. Код основан на шаблоне MVVM, но вы должны иметь возможность извлечь соответствующие фрагменты из шаблона элемента управления вкладки.

У меня нет логина OpenID, поэтому я не могу напрямую опубликовать URL. Поиск в Google для "josh smith MVVM demo app".

Только что столкнулся с этим. Я делаю MVVM, но было бы очень похоже использовать события формы. В любом случае я использовал параметр ItemContainerStyle и указал на стиль с квалификатором типа данных, например:

  <Style x:Key="TabHeader" TargetType="TabItem">
        <Setter Property="FieldLayoutSettings">
            <Setter.Value>
                <StackPanel Orientation="Horizontial">
                    <TextBlock Text="{Binding HeaderText}"/>
                    <!-- MVVM style -->
                    <Button Content="X" Command="{Binding [ICommandHere]}" />
                    <!--or... Forms style -->    
                    <Button Content="X" Click="EventHandlerHere" />
             </StackPanel>
            </Setter.Value>
            </Setter> 
    </Style>

<TabControl ItemsSource="{Binding Workspaces}"
            ItemContainerStyle="{StaticResource TabHeader}"/>

Не захватывать поток, но вы можете рассмотреть, как уродливо выглядят вещи, когда каждая вкладка имеет кнопку закрытия. Если вы предпочитаете единственную кнопку закрытия (a la Visual Studio), интегрированную в саму TabControl, вы можете взглянуть на эту запись в блоге, которая делает это как часть образца (но не является фокусом сообщения).

Comments

    Ничего не найдено.