2012-01-30 12 views

答えて

3

HereはTabControlのタブをテンプレート化のサンプルプロジェクトです。私はおそらく、*および「自動」幅「オート」の3つの列でグリッドを使用して、中央と最後の列に、それ自体でそしてちょうど最後のタブをタブの最初のセットを保持するために、最初の列でのStackPanelを入れてしまいます列が空で残りのスペースを占めるだけです。

4

この投稿は古いかもしれませんが、同じ質問への答えを探しながら、私はそれを偶然見つけたので、私は、私は私がなってしまった間に合わせのソリューションを共有しようと思いました。

私は(おかげでMeleakに出て行く)そのうちの一つにタブパネルをグリッドに互いの上に2 TabControlsを入れ、右揃え:

<Grid> 
    <TabControl x:Name="_tabsRight" GotFocus="OnTabFocused" > 
     <TabControl.Resources> 
      <Style TargetType="TabPanel"> 
       <Setter Property="HorizontalAlignment" Value="Right"/> 
      </Style> 
     </TabControl.Resources> 

     <TabItem x:Name="JustAHiddenTabItemToDeselectTheRealOne" Visibility="Hidden" /> 

     <!-- Last tab --> 
     <TabItem Header="Last one" > 
      <!-- Last content... --> 
     </TabItem> 

    </TabControl> 
    <TabControl x:Name="_tabsLeft" GotFocus="OnTabFocused" > 

     <!-- First tab --> 
     <TabItem Header="1st" > 
      <!-- First content... --> 
     </TabItem> 

     <!-- Second tab --> 
     <TabItem Header="2nd" > 
      <!-- Second content... --> 
     </TabItem> 

    </TabControl> 
</Grid> 

を次に、OnTabFocusedイベントハンドラであなたは2つの左のタブ、右に1つを持っているしたい場合は

private int _zIncrementor = 0; 
/// <summary> 
/// Hack to make two TabControls act as one. 
/// </summary> 
private void OnTabFocused(object sender, RoutedEventArgs e) 
{ 
    var tab = (TabControl)sender; 
    var otherTab = (tab == _tabsLeft) ? _tabsRight : _tabsLeft; 

    Grid.SetZIndex(tab, ++_zIncrementor); 
    otherTab.SelectedItem = null; 
} 
+1

は、私が根底にあるタブをクリックすることができませんでした。次のコードでmousedownイベントハンドラを追加しました。 プライベートvoid _tabs_MouseLeftButtonDown(オブジェクト送信側、MouseButtonEventArgs e) { ポイントpt = e.GetPosition((UIElement)sender); VAR要素= this.InputHitTest System.Windows.Controls.Primitives.TabPanelとして(PT)。 if(要素!= null && _tabsLeft.IsAncestorOf(要素)) { _tabsRight.Focus(); _tabsRight.SelectedIndex = 1; } } – Derrick

+1

@Derrick - ありがとう!私の場合、提案された答えはデバッグモードで正常に機能しましたが、最終的にアプリケーションをリリースしたとき、私は同じようなトリックをしなければならないことがわかりました。 – Sphinxxx

-1

は、あなたがその間の第三不可視のタブを持つことができます。ユーザーはのTabItemをクリックしたときに、私たちは前に一番下のTabControlを持参する必要があります非表示タブのwidthは私たちの残りのスペースを与えるWindowActualwidthからすべての3つの可視のタブWidthを減算することにより算出すること。ここで

サンプルコード

<TabControl x:Name="_tabsLeft" GotFocus="OnTabFocused" > 

    <!-- First tab --> 
    <TabItem Header="1st" > 
     <!-- First content... --> 
    </TabItem> 

    <!-- Second tab --> 
    <TabItem Header="2nd" > 
     <!-- Second content... --> 
    </TabItem> 

    <!-- Third invisible tab --> 
    <TabItem Header="Im not visible in UI" Visibility="Hidden" x:Name="invisibletab" > 
     <!-- I'm not visible in UI... --> 
    </TabItem> 

    <!-- Last tab --> 
    <TabItem Header="Last one" > 
     <!-- Last content... --> 
    </TabItem> 

</TabControl> 

バックエンドのコードです:

public MainWindow() 
{ 
    InitializeComponent();  
    this.SizeChanged += window_SizeChanged; 
} 
private void window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    invisibletab.Width = this.ActualWidth - 550; // where the 550 is the sum of the actual width of visible tabs 
} 
+0

Downvoters。 。あなたはなぜこれがdownvotedにコメントを残すだろうか?これは質問のための最も簡単な作業ソリューションです。 – Gopichandar

関連する問題