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>
解決
私が思いつく方法の 1 つは、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 の ControlTemplate 内に独自の ScrollViewer が定義されているため、マウスが TreeView 上にある場合は MouseWheel でスクロールできないことです。これを回避するには、各 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);
}
所属していません StackOverflow