2012-07-31 5 views
2

ViewBox 내에 비디오 컨트롤을 배치하여 비디오 비율을 유지하는 WPF 프로젝트가 있습니다. 비디오 컨트롤은 WindowsFormsHost 안에 래핑 된 WinForms 객체입니다. 또한 ViewBox 크기를 조정하는 gridSplitter를 추가했습니다. 이상한 버그를 발견 할 때까지는 모두 훌륭했습니다. ViewBox를 0에 가깝게 최소화하기 위해 gridSplitter 컨트롤을 사용할 때 비디오 비율은 다시 확장 한 후 망가질 것입니다. 그리고 gridSplitter를 사용하여 ViewBox를 0까지 축소 할 때 WindowsFormHost는 확장 후에 완전히 사라집니다 (여전히 존재하지만 ActualWidth 및 ActualHeight는 0입니다).Viewbox를 사용하면 WPF에서 WindowsFormsHost가 사라집니다.

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

답변

0

더 나은 Viewbox를 제거하고 WidowsFormHost 차원을 직접 제어 할 수 있습니다.

0

놓습니다 gr ID 스플리터가 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> 

당신은 그것을 보이게 바로 오른쪽에있는 뷰 박스 마진을 만들 수를 내가지고 결국

+0

GridSplitter를 이동해도 문제가 해결되지 않습니다. 내 프로덕션 코드에서 GridSplitter 컨트롤을 자체 열에 배치 했으므로 (권장되는 방법 임) 문제가 여전히 발생합니다. – Eternal21

+0

그냥 지옥을 위해, 나는 당신의 변화를 시도하고 의심되는 것처럼, 그것은 작동하지 않습니다. 문제는 뷰포트가 0으로 최소화되면 winformsHost가 절대 복구되지 않는다는 것입니다. – Eternal21

+0

@ Eternal21 - 혼란 스럽네요. 답변을 해결책으로 표시했으나 귀하의 의견은 다른 방법으로 제안합니다. 문제가 해결 되었습니까? – flamebaud

관련 문제