Viewbox使WindowsFormsHost在WPF中消失

时间:2012-07-31 21:01:00

标签: c# wpf viewbox windowsformshost

我有一个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;
        }
    }

示例代码输出: image

链接到测试项目代码(VS2008): code

2 个答案:

答案 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维度。