3

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

4

2 回答 2

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 边距设置在右侧以使其看起来更好

于 2012-07-31T22:33:30.997 回答
0

我最终摆脱了 Viewbox,并自己控制了 WidowsFormHost 尺寸。

于 2012-10-10T00:02:48.277 回答