Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Viewbox使Windows窗体在WPF中消失_C#_Wpf_Viewbox_Windowsformshost - Fatal编程技术网

C# Viewbox使Windows窗体在WPF中消失

C# Viewbox使Windows窗体在WPF中消失,c#,wpf,viewbox,windowsformshost,C#,Wpf,Viewbox,Windowsformshost,我有一个WPF项目,通过将视频控件放在一个ViewBox中来保持视频比率。视频控件是包装在WindowsFormsHost中的WinForms对象。我还添加了一个gridSplitter来调整ViewBox的大小。这一切都很好,直到我注意到一个奇怪的错误。当我使用gridSplitter控件最小化接近于零的ViewBox时,视频比率在再次扩展后会变得混乱。当我使用gridSplitter将ViewBox压缩到0时,WindowsFormHost在扩展后将完全消失(它仍然存在,但它的实际宽度和实际

我有一个WPF项目,通过将视频控件放在一个ViewBox中来保持视频比率。视频控件是包装在WindowsFormsHost中的WinForms对象。我还添加了一个gridSplitter来调整ViewBox的大小。这一切都很好,直到我注意到一个奇怪的错误。当我使用gridSplitter控件最小化接近于零的ViewBox时,视频比率在再次扩展后会变得混乱。当我使用gridSplitter将ViewBox压缩到0时,WindowsFormHost在扩展后将完全消失(它仍然存在,但它的实际宽度和实际高度现在为0)

移除ViewBox控件,只使用WindowsFormsHost可以很好地工作,但我需要ViewBox来控制纵横比。如果我找不到解决方案,我将不得不自己控制这个比率作为解决办法

我想我一定是做错了什么,所以我写了一个快速测试程序来重现这个问题。我将在下面发布一个完整程序的链接(在VS2008的C#中)

在测试程序中,我创建了一个包含两列的网格,并使用gridsplitter调整它们的大小。然后我在左控件中放置一个ViewBox,并在其中放置一个WindowsFormsHost。然后,我在WindowsFormsHost中设置了一个红色的winFormsButton

该按钮可以很好地缩放,直到完全收缩左列,然后再次展开。按钮不见了。如何防止这种情况发生,使按钮在收缩和展开左栏后继续缩放?谢谢

XAML:

示例代码输出:

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

将网格拆分器放在第0列,这样就不会有WPF布局之争。以下是修改后的代码(请注意栅格拆分器列、水平对齐和视图框边距):



您可以将ViewBox边距设置在右侧,以使其看起来更美观

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

移动GridSplitter不会解决问题。在我的产品代码中,我将GridSplitter控件放在了它自己的列中(这是推荐的做法),但问题仍然存在。为了解决这个问题,我尝试了您的更改,但正如怀疑的那样,它不起作用。问题是,一旦视口最小化为0,winformsHost将永远无法恢复。@Eternal21-我很困惑。您将答案标记为一个解决方案,但您的评论表明并非如此。这个问题解决了吗?@flamebaud你是对的,我忘了发布正确的答案。现在修好了。Viewbox导致了这些问题,过了一段时间,我放弃了试图找出确切的原因。这是更容易摆脱它,并简单地控制自己的纵横比。
<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;
        }
    }
<GridSplitter Grid.Column="0" HorizontalAlignment="Right" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
        <Viewbox Margin="10">
            <WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Viewbox>