CloseTabBehavior για TabItems σε Silverlight TabControl
Χρησιμοποιώντας το tabcontrol του Silverlight, είδα ότι δεν έχει close button σε κάθε tab. Μερικές λύσεις που είδα από το net, έκαναν extend ένα tabItem, ή έβαζαν handler κάπου για να το υλοποιήσουν. Έτσι έφτιαξα ένα behavior το οποίο γίνεται attach, λίγο πιο κομψά. Στο OnClick, υλοποίησα ένα μικρό chunk λογικής για να διατηρείται το state.
To itemtemplate
<TabControl.ItemTemplate>
<DataTemplate>
<DockPanel Width="120">
<Button 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" >
<interactivity:Interaction.Behaviors>
<behavior:CloseTabBehavior/>
</interactivity:Interaction.Behaviors>
</Button>
<ContentPresenter Content="{Binding ApplicationName}"
VerticalAlignment="Center" />
</DockPanel>
</DataTemplate>
</TabControl.ItemTemplate>
To behavior
public class CloseTabBehavior : Behavior<Button>
{
protected override void OnAttached()
{
AssociatedObject.Click += OnClick;
}
protected override void OnDetaching()
{
AssociatedObject.Click -= OnClick;
}
private static void OnClick(object sender, RoutedEventArgs e)
{
TabItem tabItem = (sender as Button).GetParent<TabItem>();
object selectedItem = tabItem.DataContext;
TabControl tabControl = (sender as Button).GetParent<TabControl>();
IList list = (IList) tabControl.ItemsSource;
int index = list.IndexOf(selectedItem);
if (list.Count == 1)
tabControl.SelectedItem = null;
else if (index < list.Count - 1 )
tabControl.SelectedItem = list[++index];
else if (index == list.Count - 1)
tabControl.SelectedItem = list[--index];
try
{
list.Remove(selectedItem);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
Όποιος έχει κάτι να προσθέσει, feel free!