2010-12-05 10 views
3

私はエクスパンダの中に複数のツリービューを持っています。しかし、高さがウィンドウのサイズよりも大きくなると、ウィンドウの外に出ます。WPFエクスパンダのサイズを制限する

明白な解決策は、利用可能な高さは

  • ウィンドウの高さ
  • に依存するため、他のエクスパンダ(開放/閉鎖、ツリービューのMaxHeightのを設定するために、私はそれを容易に決定することができないであろう

ツリービューの高さを自動的に大きくしても、ウィンドウの高さよりも大きくする必要はありません。私は考えることができる

<StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5"> 
    <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" > 
     <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1"> 
      <Grid Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 

      <TreeView Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
      </TreeView> 

     </Grid> 
    </Expander> 
    </Border> 
</StackPanel> 

答えて

2

一つの方法は、ScrollViewerの中のStackPanelを置くことです。この方法で、ウィンドウの高さを超えて拡大しないようにします。エクスパンダごとに別々のスクロールを取得することはありませんが(同じStackPanelに含まれている場合はどうしますか?)、ここで何をしているのかを100%確信しているわけではありません。

<ScrollViewer Name="stackPanelScrollViewer" 
       Loaded="stackPanelScrollViewer_Loaded" 
       VerticalScrollBarVisibility="Auto"> 
    <StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5"> 
     <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" > 
      <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1"> 
       <Grid Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
        <TreeView Name="treeView1" Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
        </TreeView> 
       </Grid> 
      </Expander> 
     </Border> 
    </StackPanel> 
</ScrollViewer> 

これの欠点は、TreeViewコントロールを使用すると、マウスがツリービューの上に配置されている場合はマウスホイールをスクロールすることができなくなりますので、それはScrollViewerのはそののControlTemplate内で定義された独自のしていることです。この問題を回避するには、TreeViewごとにMouseWheelイベントハンドラをアタッチし、そこからスクロールを作成します。

private void stackPanelScrollViewer_Loaded(object sender, RoutedEventArgs e) 
{ 
    treeView1.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true); 
    //treeView2.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true); 
} 
private void StackPanelMouseWheel(object sender, RoutedEventArgs e) 
{ 
    MouseWheelEventArgs eargs = (MouseWheelEventArgs)e; 
    double x = (double)eargs.Delta; 
    double y = stackPanelScrollViewer.VerticalOffset; 
    stackPanelScrollViewer.ScrollToVerticalOffset(y - x); 
} 
+0

ありがとうございました!私もこの方法について考えましたが、実際にはスクロールバーがツリービュー内にあり、スタックパネルやエクスパンダでは必要ありません。したがって、3つのエクスパンダがある場合、最後のものだけがツリービューにスクロールバーを表示します。しかし、それが不可能であることが判明した場合、私は答えとしてあなたの解決策をマークします。 – Muis

+0

@ジョシュア:これを正しく理解しているかどうかを確認してください。これは、最初と2番目のツリービューの高さがウィンドウの高さを越えて拡大しないことを意味しますか?それ以外の場合は、2番目のTreeViewが展開されて3番目のTreeViewがWindowの外側に「プッシュ」されるようになるとどうなるでしょうか?すべてのTreeViewは同じStackPanelにありますか? –

+0

すべてのツリービューは同じスタックパネルにあります。あなたは、2番目のツリービューもウィンドウの外に広がって(3番目の目に見えないように)展開する可能性があるかもしれませんが、私のアプリではそうは考えられません。 3番目のツリービューが残りのスペースに基づいて自動サイズを実行するなら、それは私のために十分です;) – Muis

関連する問題