我有一个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
答案 0 :(得分:0)
将网格分割器放在第0列,这样就不会有WPF布局。这是修改后的代码(注意Grid Splitter列,水平对齐和视图框边距):
<GridSplitter Grid.Column="0" HorizontalAlignment="Right" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
<Viewbox Margin="10">
<WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Viewbox>
您可以在右侧创建ViewBox边距,使其看起来更好
答案 1 :(得分:0)
我最终摆脱了Viewbox,并自己控制了WidowsFormHost维度。