2009-06-01 4 views
2

私はを持っています。ここで、TabItemDataTemplatです。テンプレートは正しく動作するように見えますが、TabItemに表示したいユーザーコントロールが正しく表示されています。WPFでテンプレート化されたTabItemで閉じるボタンを取得するにはどうすればよいですか?

TabItemに「x」が表示される方法はわかりませんが、テンプレートを使用して動的に生成されるため、各タブを閉じることができます。

私は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> 

答えて

7

このMSDNの記事は、Josh Smithの記事を参照してください。それはあなたの質問のための優れた解決策です。

WPF Apps With The Model-View-ViewModel Design Pattern

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> 
+2

当分の間、私はこれを「ダーク・アーツ」の一部とみなしていますが、かなり読書をして遊んでいます。 私はこの考え方に慣れる必要があると確信しており、これをWinformsからWPFへの切り替えの一部として受け入れる必要があります。 – Russ

+3

なぜ彼はTabItemのタイトルをDisplayNameにバインドし、代わりにTabItemのヘッダープロパティにバインドしたのだろうと思います。 – Sam

+0

シンプルでエレガント。これは私が出会い、魅力的に働いた最も簡単な解決策でした。 –

0

あなたは独自のタブコントロールを派生させる必要があります。 google searchは多くの結果を示しています。その多くはソースがあるため、ホイールを再作成する必要はありません。

0

Josh SmithはMSDN Magazineの記事で、閉じるボタンを持つタブ項目の実例を書いています。コードはMVVMパターンに基づいていますが、タブアイテムコントロールテンプレートから関連する部分を抽出できる必要があります。

私はOpenIDログインを持っていないので、URLを直接投稿できませんでした。 Google検索 "josh smith mvvm demo app"

0

スレッドをハイジャックするのではなく、すべてのタブに閉じるボタンがある場合、どのように醜いものが表示されるかを考えたいと思うかもしれません。代わりにTabControlに統合された1つのクローズボタン(Visual Studio)を好む場合は、これをサンプルの一部として行うthis blog postを見ることができます(ただし、投稿の焦点はありません) 。

+3

、およびFireFoxは良い例です)、タブ自体のタブから直接「x」するオプションがあります。私は個人的には、それがコンテクストにコンテクストをもたらすと思います。 – Russ

+2

十分です。ユーザーのマウスが確実に上がるまでボタンを隠すことで、醜さも確実に緩和されます。 –

+0

それは本当に私が終わりたいところですが、私はこれを一歩一歩踏み出しています。 – Russ

0

ちょうどその一つに走りました。私はMVVMをやっていますが、フォームイベントを使うのは非常に似ています。いずれにせよ、私はItemContainerStyleパラメータを使用し、そのようなデータ型修飾子でスタイルを指すように:あなたの言って、私は、私はaccross、(IEを実行しているほぼすべてのtabedアプリケーションを見つける午前私が聞く

<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}"/> 
+1

エラー:「TabItemでFieldLayoutSettingsが見つかりませんでした」。残念、それはよかった。 – Sam

+0

その意味は分かりませんが、 'FieldLayoutSettings'はしばしば' xmlns:igDP = "http://infragistics.com/DataPresenter" 'として定義された名前空間' igDP'に関連付けられていることがわかりました。他の読者に役立つことを願っています。 – rekire

関連する問題