C# WPF:RenderTransform应用于;“溢出效应”;内容被切断
我有一个控件,其中包含此网格:C# WPF:RenderTransform应用于;“溢出效应”;内容被切断,c#,wpf,rendertransform,C#,Wpf,Rendertransform,我有一个控件,其中包含此网格: <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 Widt
<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的作用是,当它放置在一个宽度>=PaneCtrl.MAX\u NO\u SCALE\u Width的容器中时,它会以原始大小显示按钮,但当它放置在一个宽度<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;
}
}
private void Grid\u SizeChanged(对象发送方,sizechangedventargs e)
{
如果(例如NewSize.Width
我看到的是,它的行为方式类似,但当容器宽度很小时,一些原始大小的按钮会被切掉(未显示),在我缩放StackPanel后,它们也不会显示,即使现在应该有足够的空间显示它们
所以我的问题自然是为什么
可能是因为WPF首先确定它们需要隐藏,然后引发SizeChanged事件,允许我缩放它们,之后不会“重新排列”它们
我应该挂接一个不同的事件,还是应该调用一些东西来强制WPF“重新安排”或什么?p.S.我已经尝试添加InvalidateArrange();在Grid_SizeChanged的底部,同时将Grid_SizeChanged中的代码移动到受保护的覆盖大小ArrangeOverride中。在这两种情况下,行为都是一样的(一些按钮仍然没有显示)。我现在有点明白它为什么会这样做了。令人费解的是,我的印象是容器(网格)正在“切掉”PlayBackButtons的末端,但实际上是PlayBackButtons本身(StackPanel)在做这件事。这就是为什么挂接早期事件或调用Arrange不起作用的原因。可能有效的方法是缩放PlayBackButtons的内部,而不是PlayBackButtons,但我仍然没有一种干净的工作方式。