2015-02-23 42 views
0

所以我有一個TabControl,通常駐留在TabItem中。我想將該選項卡控件放入StackPanel中,以便在TabControl上添加一些內容。但是,一旦我將TabControl放入StackPanel中,應用程序就會停止工作 - 在某處存在內存泄漏,如果我在Windows任務管理器中查看進程,它會一直使用越來越多的內存,直到需要關閉爲止。我的.xaml文件是非常簡單的:TabControl不能在stackpanel裏工作

<TabControl Name="tabControlOuter" Margin="0,20,0,0" Background="#222222" > 
<TabItem>...</TabItem> 
<TabItem>...</TabItem> 
<TabItem Header="Something" Name="something"> 
    <TabControl Name="tabControlInner" Style="{StaticResource TabControlStyle1}"/> 
</TabItem> 

我的標籤控件樣式:

<Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="Padding" Value="4,4,4,4"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="BorderBrush" Value="Black"/> 
     <Setter Property="Background" Value="#222222"/> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabControl}"> 
        <Grid x:Name="ctlgrid" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition x:Name="ColumnDefinition0"/> 
          <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition x:Name="RowDefinition0" Height="Auto"/> 
          <RowDefinition x:Name="RowDefinition1" Height="*"/> 
         </Grid.RowDefinitions> 
         <Grid Panel.ZIndex="1"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*"/> 
           <ColumnDefinition Width="Auto"/> 
          </Grid.ColumnDefinitions> 
          <WrapPanel x:Name="HeaderPanel" Grid.Column="0" IsItemsHost="true" Background="#666666" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/> 
          <DockPanel Width="300" x:Name="SearchDock" Background="#666666" Grid.Column="1" Height="65"> 
           <Border BorderBrush="White" BorderThickness="1,0,1,0" HorizontalAlignment="Right" Margin="0,0,10,0"></Border> 

           <Label x:Name="searchStat" Height="30" DockPanel.Dock="Bottom" Foreground="White"></Label> 
           <TextBox x:Name="Search" Margin="0,0,10,0" Width="150" Height="30" DockPanel.Dock="Left" /> 

           <Button ToolTip="Search" Width="35" Height="30" Padding="5,5,5,2" Margin="10,0,-30,0" Click="search_logs" DockPanel.Dock="Left" > 
            <Image Source="/Images/mglass.png" /> 
           </Button> 
           <Button ToolTip="Next Search Result" Margin="0,0,20,0" Width="30" Height="30" Content="Next" Click="next_result" DockPanel.Dock="Right"> 
           </Button> 
           <Button ToolTip="Previous Search Result" Margin="30,0,0,0" Width="30" Height="30" Content="Prev" Click="prev_result" DockPanel.Dock="Right"> 
           </Button> 


          </DockPanel> 

         </Grid> 

         <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local"> 
          <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
         </Border> 



        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="TabStripPlacement" Value="Left"> 
          <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/> 
          <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/> 
          <Setter Property="Grid.Column" TargetName="HeaderPanel" Value="0"/> 
          <Setter Property="Grid.Column" TargetName="ContentPanel" Value="1"/> 
          <Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/> 
          <Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/> 
          <Setter Property="Height" TargetName="RowDefinition0" Value="*"/> 
          <Setter Property="Height" TargetName="RowDefinition1" Value="0"/>        
         </Trigger> 

         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

現在的問題是,如果我把一個StackPanel在我的內突片控制的事情南下快速

<TabItem Header="Something" Name="something"> 
<StackPanel> 
    <TabControl Name="tabControlInner" Style="{StaticResource TabControlStyle1}"/> 
<StackPanel> 
</TabItem> 

我可以通過編程方式將選項卡項添加到我的選項卡控件中,如下所示:

TabControl itemsTab = (TabControl)this.FindName("tabControlInner"); 
      itemsTab.Items.Clear(); 
      TabItem setThistab = (TabItem)this.FindName("something"); 
      setThistab.IsSelected = true; 
      foreach (CustomItem ale in my_collection) 
      { 
       TabItem newTab = new TabItem(); 
       FrameDisplayTab ftab1 = new FrameDisplayTab(); 
       ftab1.MyDatagrid.ItemsSource = ale.logentries; 
       newTab.Content = ftab1; 
       newTab.Header = ale.name; 
       itemsTab.Items.Add(newTab); <-- this is where I get into trouble from the stack pane. Everything works fine if my inner tab control is not in a stack panel or if I omit this line 

      } 

有人可以看到發生了什麼?沒有任何例外被拋出。

+0

你嘗試過使用'FindControl()'方法vs'.FindName' – MethodMan 2015-02-23 23:12:25

+0

不,我相信FindControl()適用於Windows窗體,不適用於WPF – TwinPrimesAreEz 2015-02-23 23:44:36

回答

0

對於遇到此問題的任何人,它看起來像StackPanel是問題。看起來,除非你在StackPanel上指定了寬度和高度,否則它和它的子節點將會有NaN的高度和寬度,這是導致問題的原因。因爲我希望Height和Width是'Stretch',所以我不能使用StackPanel。

要解決此問題,我從StackPanel更改爲DockPanel。問題解決了