2016-12-17 6 views
3

ScrollViewer을 비롯한 일부 컨트롤이 포함 된 DockPanel이 있습니다.WPF ScrollViewer가 컨트롤을 윈도우 외부로 푸시

내가 할 일은 ScrollViewer이 다른 컨트롤을 폼 아래쪽으로 밀지 않고도 그리드를 스크롤 할 수 있도록하는 것입니다.

대신 은 Button의 맨 위가 아닌 창의 높이로 확장되어 양식의 하단에 대해 Button을 끕니다. 왜 이런거야? 어떻게 수정해야합니까?

<Window x:Class="Class1.MainWindow" 
    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" 
    xmlns:local="clr-namespace:Class1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="800" Width="600" 
    WindowStartupLocation="CenterScreen"> 
<DockPanel LastChildFill="False"> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="File"> 
      <MenuItem Name="miQuit" Header="Quit" Click="miQuit_Click" /> 
     </MenuItem> 
    </Menu> 
    <ToolBarTray DockPanel.Dock="Top" IsLocked="True"> 
     <ToolBar> 
      <Button Name="btnQuit" ToolBar.OverflowMode="Never" Click="btnQuit_Click"> 
       Quit 
      </Button> 
     </ToolBar> 
    </ToolBarTray> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" DockPanel.Dock="Top" VerticalAlignment="Stretch"> 
     <Grid Name="gMainGrid" ScrollViewer.CanContentScroll="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <TextBox Grid.Column="0" Grid.Row="0" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="1" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="2" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="3" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="4" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="5" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="6" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="7" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="8" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="9" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="10" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="11" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="12" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="13" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="14" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="15" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="16" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="17" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="18" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="19" Width="100" Margin="10,10,10,10"/> 
      <TextBox Grid.Column="0" Grid.Row="20" Width="100" Margin="10,10,10,10"/> 
     </Grid> 
    </ScrollViewer> 
    <Button Name="btnButton1" DockPanel.Dock="Bottom" Click="btnButton1_Click" >ButtonText</Button> 
</DockPanel> 

나는 화면 상단의 메뉴 표시 줄, 화면 하단의 버튼을 중간에 ScrollViewer와 그리드를 원한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

문제는 ScrollViewer이 얼마나 높이 야하는지 모르기 때문입니다. ScrollViewer은 자식이 필요로하는만큼의 크기를 얻으려고하는 컨트롤입니다. DockPanelScrollViewer 필요에 따라 크기가 커지므로 문제가됩니다. ScrollViewer의 높이 (픽셀 : Height=100)를 고정 높이로 고정 할 수 있습니다. 귀하의 유스 케이스에 대해 잘 모르기 때문에 예를 들어 이미지 회전식 캐 러셀을 보여줄 때 유용 할 수 있습니다. 나는 모든 일을 갇혀 있다면이 DockPanel와 동적 높이를 가질 수 있음을 발견

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="auto" /> 
     <!-- Next one is for middle part of the page --> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="auto" /> 
    </Grid.RowDefinitions> 
    <!-- your controls here --> 
</Grid> 
0

: 난 당신이 더 나은 대신 DockPanel의 그리드를 사용하는 거라고 말할 수있는 일반적인 레이아웃 조언에

그리드에서. 이것은 이제 작동하기 때문에, 나는 이제 ScrollViewer의 동적 높이를 가질 수 있습니다. "자동"의 Height

 </DockPanel> 
    <Button Grid.Column="0" Grid.Row="1" Name="btnButton1" DockPanel.Dock="Bottom" Click="btnButton1_Click" >ButtonText</Button> 
</Grid> 

행 것이다 : 나는 DockPanel의 외부와 그리드의 두 번째 행에 내 버튼을 이동하는 것을 제외하고

<Window x:Class="Class1.MainWindow" 
    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" 
    xmlns:local="clr-namespace:Class1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="800" Width="600" 
    WindowStartupLocation="CenterScreen"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Column="0" Grid.Row="0" LastChildFill="False"> 

모두는 다음과 같은 정상입니다 콘텐츠에 맞게 크기 별표 (*)가 Height 인 행은 자동차의 크기가 계산 된 후 남은 공간을 채우기 위해 크기가 조정됩니다. 따라서 모든 것이 정확하고 정중하게 크기가 조정됩니다.

또한,이 시점에서 나는 완전히 DockPanel와 멀리 할 및 가질 수 Menu, 자신의 별도의 그리드 행 ToolBarTray, ScrollViewerButton, 잘 모르겠어요하지만 에마는 (자신의 대답에 제안 같은 것을 여분의 행은 그들의 예를위한 것이다).

<Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

내가 궁극적으로 그 접근 방식 가기로 결정, 그래서 나는 대답으로 표시됩니다,하지만 난에 원하는 경우에 사람들은 어떻게합니까 (완전성에 대한 전체 설명은 모두 여기에 이러는거야 DockPanel으로 유지).