2012-09-18 30 views
1

我在mainwindow.xaml文件選項卡控制。在啓動時,當應用程序運行時,會顯示所有四個選項卡。有沒有一種辦法,一旦用戶雙擊「連接」標籤,該標籤的整個視圖作爲一個新的浮動窗口彈出,如果我雙擊,在彈出的窗口,它可以追溯到初始狀態?雙擊該TabItem的選項卡控件和View會彈出浮動窗口

<Grid Grid.Row="0" > 
     <TabControl Name="ConnectTab" Style="{DynamicResource styleBackground}" />       
       <tablocal:CloseableTabItem Header="Connect" /> 
       <tablocal:CloseableTabItem Header="I2C" /> 
       <tablocal:CloseableTabItem Header="Voltage" /> 
       <tablocal:CloseableTabItem Header="Clock" /> 
     </TabControl> 
</Grid> 

這是我的標籤closebutton方法:

private void CloseTab(object source, RoutedEventArgs args) 
    {    
     TabItem tabItem = args.Source as TabItem; 

     if (ConnectTab != null && ConnectTab.Items.Count > 1) 
      ConnectTab.Items.Remove(tabItem);      
    } 

Closetab類:

public class CloseableTabItem : TabItem 
{ 
    static CloseableTabItem() 
    { 
     //This OverrideMetadata call tells the system that this element wants to provide a style that is different than its base class. 
     //This style is defined in themes\generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem), 
      new FrameworkPropertyMetadata(typeof(CloseableTabItem))); 
    } 

    public static readonly RoutedEvent CloseTabEvent = 
     EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), typeof(CloseableTabItem)); 

    public event RoutedEventHandler CloseTab 
    { 
     add { AddHandler(CloseTabEvent, value); } 
     remove { RemoveHandler(CloseTabEvent, value); } 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     Button closeButton = base.GetTemplateChild("PART_Close") as Button; 
     if (closeButton != null) 
      closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click); 
    } 

    void closeButton_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this)); 
    } 
} 
+0

你自己寫的CloseableTabItem的代碼?你可以發佈它,這樣我們可以重新創建你的場景? – michele

+0

@michele:添加了closeabletabitem類。我不認爲這有什麼區別。我只想要一個浮動窗口出現,一旦我雙擊標籤(可以說連接) –

回答

1

的概念是完全可能的。問題將是找到代碼來做到這一點。

基本上你需要從當前的TabControl重新宿主你的TabItem並將其駐留在新的TabControl內的一個新窗口。 此代碼就是一個簡單的演示,不應該被認爲是生產質量

在MainWindow.xaml

<Window x:Class="WpfApplication4.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<TabControl Name="myTabControl"> 
    <TabItem Name ="mytabItem" Header="Double cllick me" MouseDoubleClick="TabItem_MouseDoubleClick"> 
     <TextBlock Text="Hello world!"/> 
    </TabItem> 
</TabControl> 

在MainWindow.xaml.cs

private void TabItem_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (myTabControl.Items.Count ==0) return; 

     myTabControl.Items.Remove(mytabItem);   
     var newWindow = new TempWindow(myTabControl, mytabItem);    
     newWindow.Show(); 
    } 

在TempWindow.cs

class TempWindow : Window 
{ 
    private TabControl _original; 

    public TempWindow(TabControl original, TabItem tabItem) 
    { 
     MouseDoubleClick += new System.Windows.Input.MouseButtonEventHandler(TempWindow_MouseDoubleClick); 
     _original = original; 
     var tabControl = new TabControl(); 
     Content = tabControl; 

     tabControl.Items.Add(tabItem); 
    } 

    void TempWindow_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     var tabItem = ((TabControl)Content).Items[0]; 
     ((TabControl)Content).Items.RemoveAt(0); 
     _original.Items.Add(tabItem); 

     this.Close(); 
    } 
} 
+0

我同意Per的觀點,你真的需要處理各種事件,並將標籤移回或移出。我的例子重新定位了標籤,但從長遠來看,它可能會更安全。你有沒有考慮過使用對接管理器代碼庫? – AlSki

+0

快速搜索爲您提供了不少替代對接庫http://www.bing.com/search?q=wpf+docking+manager&form=IE8SRC&src=IE-SearchBox – AlSki

+0

這看起來不錯。我可以彈出一個彈出窗口,但點擊彈出窗口的標題欄時,它會退回到初始狀態。在你的情況下,它達到最大狀態。 –

0

是的,這是絕對有可能的。我在我的一個應用程序中這樣做,但不是雙擊,我有一個用戶單擊的圖標,並且當窗口最小化時,它將被放回選項卡中。

我不能給你一個完整的解決方案,但這裏有幾個指標,這應該可以幫助您開始:

我假設你使用MVVM。

要處理的視圖的實際對接/出塢,有些工作是必須的。首先,您應該將視圖變爲UserControl,以便您可以輕鬆地將其呈現在窗口或選項卡中。

然後,您需要一個管理器來保存特定ViewModel當前視圖的引用,以便根據用戶交互根據需要在兩種視圖類型(選項卡或窗口)之間切換。這位經理必須創建/處理選項卡和窗口,並更新這些DataContext(你的ViewModel)。

您還需要處理的東西作爲窗口關閉的事件 - 應該認爲回到標籤版本或接近等等等等

+0

感謝您的回覆@Per。但我對這個MVVM世界完全陌生。你可以發佈一個樣本,做你正在做什麼與你的particluar演示應用程序?這將是有益的:) –

+0

對不起,但我不能給你我使用的代碼。我真的建議你熟悉MVVM,一旦你掌握了它,它使WPF的工作更容易。 (儘管MVVM不是所有東西的解決方案)。 – Per

+0

^我可以理解,但由於截止日期,我真的很擔心。 –

相關問題