Viewbox使WPF中的WindowsFormsHost消失

3
我有一个WPF项目,其中我通过将视频控件放在ViewBox中来保持视频比例。视频控件是包裹在WindowsFormsHost中的WinForms对象。我还添加了gridSplitter来调整ViewBox的大小。一切都很好,直到我注意到一个奇怪的bug。当我使用gridSplitter控件将ViewBox最小化接近零时,视频比例在再次展开后会出现问题。当我使用gridSplitter将ViewBox收缩到0时,WindowsFormHost在扩展后会完全消失(它仍然存在,但其实际宽度和高度现在为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): 代码

2个回答

0

将您的网格分隔器放置在第零列,这样您就不会遇到WPF布局问题。以下是修改后的代码(请注意网格分隔器列、水平对齐和视图框边距):

<GridSplitter Grid.Column="0" HorizontalAlignment="Right" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
        <Viewbox Margin="10">
            <WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Viewbox>

你可以将 ViewBox 的边缘设置为靠右以使其看起来更好。

移动GridSplitter不会解决问题。在我的生产代码中,我将GridSplitter控件放置在它自己的列中(这是推荐的做法),但问题仍然存在。 - Eternal21
只是出于好奇,我尝试了你的更改,正如我所料,它不起作用。问题在于一旦Viewport最小化为0,winformsHost就无法恢复。 - Eternal21
@Eternal21 - 我有点困惑。你将答案标记为解决方案,但你的评论似乎并不是这样。这个问题解决了吗? - flamebaud
@flamebaud 你说得对,我忘记发布正确的答案了。现在已经修复了。Viewbox引起了问题,过了一会儿我放弃了尝试弄清楚原因。更容易的方法是摆脱它,自己控制纵横比。 - Eternal21

0

最终我放弃了Viewbox,自己控制WidowsFormHost的尺寸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接