我有一个带有这个网格的控件:
<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 的容器中时,它会缩小按钮。
我想在代码中达到相同的效果。不要问我为什么——解释起来需要很长时间。
所以我删除了 ViewBox 和其他使它发生的元素,留下了这个 XAML:
<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“重新安排”或什么?