我有一个 WPF 项目,通过将视频控件放在 ViewBox 中来保持视频比例。视频控件是包装在 WindowsFormsHost 中的 WinForms 对象。我还添加了一个 gridSplitter 来调整 ViewBox 的大小。一切都很好,直到我注意到一个奇怪的错误。当我使用 gridSplitter 控件将 ViewBox 最小化到接近于零时,再次展开后视频比率会被搞砸。而当我使用 gridSplitter 将 ViewBox 一直收缩到 0 时,WindowsFormHost 会在展开后完全消失(它仍然存在,但 ActualWidth 和 ActualHeight 现在为 0)。
删除 ViewBox 控件,只使用 WindowsFormsHost 工作正常,但我需要 ViewBox 来控制纵横比。如果我找不到解决方案,我将不得不自己控制比率作为解决方法。
我想我一定是做错了什么,所以我写了一个快速测试程序来重现这个问题。我将在下面发布一个完整程序的链接(它在 C#、VS2008 中)。
在测试程序中,我创建了一个带有两列的网格,并带有一个允许您调整它们大小的 gridsplitter。然后我在左侧控件中放置一个 ViewBox 并在其中放置一个 WindowsFormsHost。然后我在 WindowsFormsHost 中托管一个红色的 _winFormsButton。
该按钮可以很好地缩放,直到您完全收缩左列然后再次展开它。按钮不见了。如何防止这种情况发生,以便在收缩和扩展左栏后按钮继续缩放?谢谢。
XAML:
<Window x:Class="DisappearingHost.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.5*" />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" HorizontalAlignment="Left" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
<Viewbox>
<WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Viewbox>
</Grid>
</Window>
代码背后:
public partial class Window1 : Window
{
System.Windows.Forms.Button _winFormsButton = new System.Windows.Forms.Button();
public Window1()
{
InitializeComponent();
_winFormsButton.Text = "I disappear!";
_winFormsButton.Size = new System.Drawing.Size(50, 50);
_winFormsButton.BackColor = System.Drawing.Color.Red;
windowsFormsHost1.Child = _winFormsButton;
}
}
示例代码输出:
测试项目代码链接(VS2008): code