このグリッドを含むコントロールがあります。
<Grid SizeChanged="Grid_SizeChanged" MaxWidth="{x:Static local:PaneCtrl.MAX_NO_SCALE_WIDTH}">
<Viewbox MaxHeight="32" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,5">
<DockPanel Width="{x:Static local:PaneCtrl.MAX_NO_SCALE_WIDTH}">
<StackPanel x:Name="PlaybackButtons" Orientation="Horizontal" Height="32" HorizontalAlignment="Center" >
<StackPanel.Effect>
<DropShadowEffect ShadowDepth="1" />
</StackPanel.Effect>
<Button x:Name="CornerRewind" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlFastBackward" >
<Image Source="/Pics/FastBackBtn.png" />
</Button>
<Button x:Name="CornerStop" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlStop" >
<Image Source="/Pics/StopBtn.png" />
</Button>
<Button x:Name="CornerPlay" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlPlay" >
<Image Source="/Pics/PlayBtn.png"/>
</Button>
<Button x:Name="CornerPause" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlPause" >
<Image Source="/Pics/PauseBtn.png"/>
</Button>
<Button x:Name="CornerFastForward" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlFastForward" >
<Image Source="/Pics/FastFwdBtn.png"/>
</Button>
<Button x:Name="CornerStepBack" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlBackAfewSec" >
<Image Source="/Pics/BackAfewSecBtn.png"/>
</Button>
<Button x:Name="CornerGoToLive" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlLive" >
<Image Source="/Pics/LiveBtn.png"/>
</Button>
</StackPanel>
</DockPanel>
</Viewbox>
</Grid>
この XAML が行うことは、Width >= PaneCtrl.MAX_NO_SCALE_WIDTH のコンテナーに配置されると、ボタンが元のサイズで表示されますが、幅 < PaneCtrl.MAX_NO_SCALE_WIDTH のコンテナーに配置されると、ボタンが縮小されます。
同じ効果をコードで実現したかったのです。理由は聞かないでください。説明するには時間がかかりすぎます。
そのため、この XAML を残して、それを可能にした ViewBox とその他の要素を削除しました。
<Grid SizeChanged="Grid_SizeChanged" >
<StackPanel x:Name="PlaybackButtons" Orientation="Horizontal" Height="32" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,5">
<StackPanel.Effect>
<DropShadowEffect ShadowDepth="1" />
</StackPanel.Effect>
<Button x:Name="CornerRewind" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlFastBackward" >
<Image Source="/Pics/FastBackBtn.png" />
</Button>
<Button x:Name="CornerStop" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlStop" >
<Image Source="/Pics/StopBtn.png" />
</Button>
<Button x:Name="CornerPlay" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlPlay" >
<Image Source="/Pics/PlayBtn.png"/>
</Button>
<Button x:Name="CornerPause" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlPause" >
<Image Source="/Pics/PauseBtn.png"/>
</Button>
<Button x:Name="CornerFastForward" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlFastForward" >
<Image Source="/Pics/FastFwdBtn.png"/>
</Button>
<Button x:Name="CornerStepBack" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlBackAfewSec" >
<Image Source="/Pics/BackAfewSecBtn.png"/>
</Button>
<Button x:Name="CornerGoToLive" Style="{StaticResource ImageButtonStyle}" PreviewMouseLeftButtonDown="CornerPlayerControlLive" >
<Image Source="/Pics/LiveBtn.png"/>
</Button>
</StackPanel>
</Grid>
次に、サイズ変更イベント ハンドラーを追加しました。
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (e.NewSize.Width < PaneCtrl.MAX_NO_SCALE_WIDTH)
{
double scale = e.NewSize.Width / PaneCtrl.MAX_NO_SCALE_WIDTH;
PlaybackButtons.RenderTransform = new ScaleTransform(scale, scale, PlaybackButtons.ActualWidth / 2, PlaybackButtons.ActualHeight);
}
else
{
PlaybackButtons.RenderTransform = null;
}
}
私が見ているのは、それが同様の方法で動作することですが、コンテナの幅が非常に小さいため、元のサイズのボタンの一部が切り落とされる場合 (表示されていません)、StackPanel をスケーリングした後も表示されません。それらを表示するのに十分なスペースができました。
当然、私の質問はなぜですか?
おそらく、WPF が最初にそれらを非表示にする必要があると判断し、次に SizeChanged イベントを発生させてスケーリングできるようにし、その後それらを「再配置」しないためです。
別のイベントをフックする必要がありますか、または何かを呼び出して WPF を強制的に「再配置」する必要がありますか?