2012-06-28 7 views
3

SWF 개체가 WPF 창 내부의 WindowsFormsHost 컨트롤에 포함되어 있습니다.Toolbar Overlay over WindowsFormsHost

swf 동영상 위에 툴바를 추가하고 싶습니다.

아래 코드의 스 니펫 문제는 새 컨트롤이 호스트 컨트롤에 추가 될 때 (또는 동영상이로드되었을 때 아직 어떤 것을 찾지 못했는지) 툴바가 실제로 보이지 않는다는 것입니다. swf의 Z- 인덱스가 어떤 이유에서든 최상위로 설정되어있는 것 같습니다. 여기

는 모습입니다 같은 :

XAML :

<Grid Name="Player"> 
    <WindowsFormsHost Name="host" Panel.ZIndex="0" /> 
    <Grid Name="toolbar" Panel.ZIndex="1" Height="50" 
     VerticalAlignment="Bottom"> 
      [play, pause, seek columns go here] 
    </Grid> 
</Grid> 

C 번호 :

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    flash = new AxShockwaveFlashObjects.AxShockwaveFlash(); 
    host.Child = flash; 
    flash.LoadMovie(0, [movie]); // Movie plays, but no toolbar :(
} 

이 문제에 어떤 통찰력이 많이 주시면 감사하겠습니다.


업데이트 : 더 적절한 대답이 게시되지 않았기 때문에, 내가 아래에있는 내 자신의 솔루션을 배치 한. 나는 이것이 솔루션보다 더 많은 해킹이라는 것을 알고 있으므로 다른 제안을 할 수 있습니다.

+0

참고 : '호스트'를 대상으로 '도구 모음'을 팝업 안에 중첩 시키려고했습니다. 이 메소드의 문제점은 윈도우가 이동/크기 변경되면 팝업이 따르지 않는다는 것입니다. – funseiki

+0

일부 해킹 없이는 불가능한 것처럼 보입니다. Microsoft의 [post] (http://msdn.microsoft.com/en-us/library/ms744952.aspx) – funseiki

+0

(위의 링크에서) "호스팅 된 Windows Forms 컨트롤은 Adorner 요소 위에 그려져 있습니다." 나는 Adorner를 사용한다고 말하려고했으나, 이것이 작동하지 않는 것처럼 보입니다. – Tom

답변

0

내가 발견 한 또 다른 해결책은 Windows Forms의 'ElementHost 컨트롤을 사용하는 것입니다. WPF 윈도우 내부에서 Windows Form을 사용하고 있기 때문에 전체 Windows Form을 사용하고 Z-Issue 두통을 피할 수는 없습니다.

ElementHost 컨트롤은 도구 모음 UserControl을 계속 사용하고 Windows Form 내에 포함 할 수 있기 때문에 정말 유용합니다. Windows Forms에서 자식 추가가 까다로운 일임을 발견 했으므로 솔루션을 설명하는 코드 단편이 있습니다.

먼저 ActiveX 개체를 던지고 디자이너를 사용하여 ElementHost 컨트롤을 던집니다.

Form1.designer.cs입니다 : 아이가 디자이너에서 설정되지 않았 음을

private AxShockwaveFlashObjects.AxShockwaveFlash flash; 
private System.Windows.Forms.Integration.ElementHost elementHost1; 

Form1.cs를

public Form1(string source) 
{ 
    InitializeComponent(); 
    toolbar = new UserControl1(); 
    this.elementHost1.Child = this.toolbar; 
    this.flash.LoadMovie(0, source); 
} 

참고. 더 복잡한 UserControls에 대해서는 디자이너가 불만을 토로한다는 사실을 발견했습니다 (런타임에는 아무 일도 일어나지 않지만).

이 솔루션은 여전히 ​​이상적이지는 않지만 두 가지 장점을 모두 제공합니다. XAML에서 UserControl을 코딩 할 수 있지만 이제는 Z- 색인 문제에 대해 걱정할 필요가 없습니다.

0

여기 WindowsFormsHost Z- 색인 문제에 대한 해킹입니다.

아이디어는 팝업 내에 중첩 된 오버레이 될 필요가있는 것을 배치하는 것입니다. 그런 다음 창이 크기가 조정되거나 이동 될 때마다 this answer과 같은 팝업 위치를 업데이트하십시오.

참고 : 창이 활성화되거나 비활성화되면 이벤트를 처리하여 창이 초점이 맞지 않거나 다른 창 뒤로 이동하면 팝업이 사라질 수 있습니다.

XAML :

<Window [stuff] 
    LocationChanged="Window_LocationChanged" 
    SizeChanged="Window_SizeChanged" > 
    <Grid Name="Player"> 
    [same code as before] 
     <Popup Name="toolbar_popup" IsOpen="True" PlacementTarget="{Binding ElementName=host}"> 
      [toolbar grid goes here] 
     </Popup> 
    </Grid> 
</Window> 

C 번호 :

private void resetPopup() 
{ 
    // Update position 
    // https://stackoverflow.com/a/2466030/865883 
    var offset = toolbar_popup.HorizontalOffset; 
    toolbar_popup.HorizontalOffset = offset + 1; 
    toolbar_popup.HorizontalOffset = offset; 

    // Resizing 
    toolbar_popup.Width = Player.ActualWidth; 
    toolbar_popup.PlacementRectangle = new Rect(0, host.ActualHeight, 0, 0); 
    toolbar_popup.Placement = System.Windows.Controls.Primitives.PlacementMode.Top; 
} 
private void Window_LocationChanged(object sender, EventArgs e) 
{ resetPopup(); } 

private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ resetPopup(); }