2017-11-12 9 views
0

次のコードを書き換えて、TabItemである最も近い親を見つけてTabControlから削除する方が簡単ですか?WPFが最も近い親(TabItem)の親をクリックして閉じます

私は新しいTabItemを動的に追加するTabControlを持っています。私はこのように見える各タブにHeaderTemplateを割り当てます。

<DataTemplate x:Key="AttorneyTabHeader"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="THE title" Margin="2,0,0,0" FontSize="16" VerticalAlignment="Center" /> 
     <Button Width="Auto" UseLayoutRounding="False" BorderBrush="Transparent" Background="Transparent" Click="CloseAttorneysTabButtonClick"> 
      <Image Source="/images/close-cross-thin-circular-button/close-cross-thin-circular-button16.png" Height="16"></Image> 
     </Button> 
    </StackPanel> 
</DataTemplate> 

ヘッダーには閉じるボタンがあり、ボタンをクリックするたびにTabItemを閉じたいと思います。私のクリックハンドラは次のようになります。

public void CloseAttorneysTabButtonClick(object sender, RoutedEventArgs e) 
{ 
    TabItem this_tab = (TabItem)((Button)sender).Parent.GetParentObject().GetParentObject().GetParentObject().GetParentObject().GetParentObject().GetParentObject(); 
    AttorneysTabControl.Items.Remove(this_tab); 
} 

私は今、私はボタンを変更し、ハンドラを変更し忘れたと何度も何度も親を得ることに依存していますので、これを書き換えるには良い方法があるかどうかを疑問に思って。

答えて

0

おそらくいくつかの方法がありますが、最も簡単なのは、ButtonTagプロパティのTabItemにバインドして、イベントハンドラで使用できるようにすることです。

<DataTemplate x:Key="TabHeaderTemplate"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="The Title" Margin="2 0 0 0" FontSize="16" VerticalAlignment="Center" /> 
     <Button Width="Auto" UseLayoutRounding="False" 
       BorderBrush="Transparent" Background="Transparent" 
       Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}, Mode=OneWay}" 
       Click="Button_Click"> 
      <Image Source="images/close.png" Height="16" /> 
     </Button> 
    </StackPanel> 
</DataTemplate> 

あなたのイベントハンドラは比較的シンプルにでき、あなたの例のように多くのことを知る必要はありません。

void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (sender is Button button && button.Tag is TabItem item) { 
     var tabControl = (TabControl)item.Parent; 
     tabControl.Items.Remove(item); 
    } 
} 
関連する問題