2013-07-09 3 views
0

모든,ScrollViewer는 내가하는 일에 상관없이 모든 것을 처리합니다. :(

나는 WPF로 초보자 오전이 많은 사람들이. 나는 단지. 다음 프로그래밍 코드에로드 XAML의 다음 조각을 함께 넣어 가지고 투쟁 문제가 될 것으로 보인다 템플릿을 사용하고 코드 인스턴스화 된 TabControl 개체에 적용됩니다. 거기에서 탭 및 탭 임의의 가짜 데이터를 생성합니다. 문제는 내 TabControl의 ScrollViewer 무한히 모든 것을 넘어서서 및 스크롤 때문에 성장하고있다. 설정하려고했습니다. 모든 VerticalAlignment가 "Stretch"로 트리를 확장했지만 도움이되지 않았습니다. 런타임에 여러 사용자 화를 결합하여 인스턴스화하는 것이 간단한 문제라는 느낌이 들었습니다. 어떤 도움이라도 대단히 감사하겠습니다.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
    Title="Window2"> 
<TabControl> 
    <TabControl.Template> 
     <ControlTemplate TargetType="TabControl"> 
      <DockPanel VerticalAlignment="Stretch"> 
       <ScrollViewer VerticalAlignment="Stretch"> 
        <ScrollViewer.Template> 
         <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
          <Grid x:Name="Grid" VerticalAlignment="Stretch" Background="{TemplateBinding Background}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Rectangle x:Name="Corner" Grid.Column="0" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Row="1"/> 
           <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" Margin="{TemplateBinding Padding}" Grid.Row="0"/> 
           <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar" Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/> 
           <ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/> 
          </Grid> 
         </ControlTemplate> 
        </ScrollViewer.Template> 
        <TabPanel x:Name="HeaderPanel" 
          Panel.ZIndex ="1" 
          KeyboardNavigation.TabIndex="1" 
          Grid.Column="0" 
          Grid.Row="0" 
          Margin="2,2,2,0" 
          IsItemsHost="true"/> 
       </ScrollViewer> 
       <ContentPresenter x:Name="PART_SelectedContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Margin="{TemplateBinding Padding}" ContentSource="SelectedContent"/> 
      </DockPanel> 
     </ControlTemplate> 
    </TabControl.Template> 
</TabControl> 

TabControl tabs = new TabControl(); 
     string xamlPath = System.IO.File.ReadAllText("..\\..\\Resources\\Templates\\Template.xaml"); 
     Window window = (Window)XamlReader.Parse(xamlPath); 
     tabs.Template = ((TabControl)window.Content).Template; 

     Random rand = new Random(); 

     for (int i = 0; i < 100; i++) 
     { 

      DataTable dataTable = new DataTable(); 
      for (int x = 0; x < 50; x++) dataTable.Columns.Add(x.ToString(), typeof(double)); 

      for (int x = 0; x < 50; x++) 
      { 
       DataRow dataRow = dataTable.NewRow(); 
       dataTable.Rows.Add(dataRow); 
      } 
      DataView dataView = new DataView(dataTable); 
      for (int x = 0; x < 50; x++) 
      { 
       for (int y = 0; y < 50; y++) dataView[x][y] = rand.Next()%100; 
      } 

      DataGrid table = new DataGrid(); 
      table.ItemsSource = dataView; 


      TabItem tab = new TabItem(); 
      tab.Header = "Tab " + (i+1); 
      tab.Content = table; 

      tabs.Items.Add(tab); 
     } 
     tabs.TabStripPlacement = Dock.Left; 
     tabs.VerticalAlignment = VerticalAlignment.Stretch; 
     tabs.HorizontalAlignment = HorizontalAlignment.Stretch; 
     option.canvas.Children.Add(tabs); 
+0

사용자는 TabControl을 제한하지 않습니다. 높이와 너비가있는 격자에 넣어야합니다. * – Paparazzi

답변

0

을 편집을 TabControl을 제한 할 필요: 아래 내 원래의 솔루션이었다. 문제는 Canvas를 처음 사용하는 것으로 나타났습니다. DockPanel을 사용하여 크기를 다시 계산할 필요가 없습니다. 이것은 Blam의 대답과 유사합니다.

캔버스가 높이/너비를 갖도록 강요했습니다. 모든 것이 동적으로 크기가 지정되었으므로 레이아웃 렌더링 전에 높이를 계산하지 않으므로 Content 객체의 최상위 패널은 분명히 수동으로 계산 된 크기 여야합니다. 당연히 XAML/C# 장벽이 있었기 때문에 문제가 상당히 잘게되었습니다.

아래 코드는 누락되었습니다. 추가 한 후에 원래 게시물의 XAML 및 C# 코드가 모두 완벽하게 정렬되었습니다. 기본적으로 최상위 레벨 Panel은 하위 레벨 오브젝트가 그 주위에서 동적으로 크기를 조정할 수있는 크기를 가져야합니다.

option.canvas.Height = OptionTabs.ActualHeight - tab.ActualHeight - tab.Margin.Bottom - tab.Margin.Top; 
option.canvas.Width = OptionTabs.ActualHeight - tab.Margin.Right - tab.Margin.Left; 
0

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
    Title="Window2"> 
    <Grid ShowGridLines="False"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"></RowDefinition> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <TabControl Grid.Row="0" Grid.Comlumn="0"/> 
    </Grid> 
</Window> 
+0

상호 작용 코드도 게시했습니다. 내가 게시 한 코드 스 니펫과 관련하여 어떤 의미인지 알 수 없습니다. 모든 정렬 속성을 창 크기까지 "늘이기"로 설정하는 방법이 있어야합니까? – unwrittenrainbow

+0

또한 모든 것을 포함하는 Canvas는 TabItem.Content 개체 안에 들어있는 개체입니다. TabItem에 대한 콘텐츠 필드의 크기를 가져 오는 방법이 있습니까? 나는 또한 문제가 될 수도 있다고 생각한다. – unwrittenrainbow

+0

코드 스 니펫으로 무엇을 할 지 모른다. 해당 행 및 열 정의가있는 표에 TabControl을 배치하십시오. – Paparazzi