我有一个WPF项目,我通过将视频控件放置在ViewBox中来保持视频比例。视频控件是一个封装在WindowsFormsHost中的WinForms对象。我还添加了一个gridSplitter来调整ViewBox的大小。这一切都很好,直到我注意到一个奇怪的bug。当我使用gridSplitter控件将ViewBox接近零时,视频比例在再次展开后会变得不合适。当我使用gridSplitter将ViewBox缩小到0时,WindowsFormHost会在展开后完全消失(它仍然存在,但它的ActualWidth和ActualHeight现在为0)。Viewbox使WindowsFormsHost在WPF中消失
删除ViewBox控件,并使用WindowsFormsHost工作正常,但我需要ViewBox来控制纵横比。如果我找不到解决方案,我将不得不自行控制比率作为解决方法。
我想我一定是做错了,所以我写了一个快速测试程序,重现了这个问题。我将发布一个链接到下面的完整程序(它在C#中,VS2008)。
在测试程序中,我创建了一个带有两个分栏的网格,可以让您调整它们的大小。然后,我将一个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
移动GridSplitter不会解决问题。在我的生产代码中,我将GridSplitter控件放置在它自己的列中(这是推荐的做法),并且问题仍然存在。 – Eternal21 2012-08-01 03:48:12
只是为了它的地狱,我尝试了你的改变,并怀疑它不起作用。问题是一旦视口最小化为0,winformsHost就不会恢复。 – Eternal21 2012-08-01 03:56:54
@ Eternal21 - 我很困惑。您将答案标记为解决方案,但您的评论意见不一。这是否得到解决? – flamebaud 2012-10-09 16:56:56