Как я могу получить кнопку закрытия на шаблонной 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>
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