2009-08-19 2 views
1

winforms 응용 프로그램에서 참조 할 WPF controls dll에 대한 작업을 시작했습니다.WPF Controls DLL 질문

이 프로젝트의 첫 컨트롤은 간단한 컨테이너 컨트롤입니다. 삶의 목적은 모덜리스의 투명 도킹 윈도우를 Winforms 앱에 제공하는 것입니다.

이 컨트롤의 문제점은 끌기를 시도 할 때 움직일 수 없다는 것입니다. .dll 파일에 넣지 않으면 옮길 수 있습니다. DLL 내부에서 Canvas.GetLeft는 잘못된 숫자를 반환하며이를 해결하는 방법을 모르겠습니다.

<Grid Height="Auto"> 
    <Grid.Resources> 
     <LinearGradientBrush x:Key="BackBrush" EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#C4000000"/> 
      <GradientStop Offset="1" Color="#66000000"/> 
      <GradientStop Color="#61000000" Offset="0.50400000810623169"/> 
     </LinearGradientBrush> 
    </Grid.Resources> 

    <Border Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Margin="0,0,0,0" BorderBrush="#FF000000" BorderThickness="2,2,2,2" Background="{StaticResource BackBrush}" Opacity="1" CornerRadius="8,8,8,8"> 
     <StackPanel Background="{x:Null}" Opacity="1" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Top" x:Name="spWhatAreYouDoing"> 
      <ContentControl></ContentControl> 
     </StackPanel> 
    </Border> 
    <Thumb Background="{x:Null}" Opacity="0" DragDelta="onDragDelta" x:Name="panelthumb"/> 

</Grid> 

내가 뒤에있는 코드에서 엄지 손가락의 onDragDelta 이벤트를 구부려 주변이 창을 드래그 것을 사용했습니다

다음은이 컨트롤에 대한 XAML의 대부분이다. 동일한 .exe에서 사용하면 정상적으로 작동합니다.

public void onDragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
    { 
     Canvas.SetLeft(this, Canvas.GetLeft(this) + e.HorizontalChange); 
     Canvas.SetTop(this, Canvas.GetTop(this) + e.VerticalChange); 
    } 

내가 한 .exe에서이 같은 코드를 가지고 그 .DLL을 참조하고 내 EXE에서 컨트롤을 사용 .dll 인으로 배치 - 그것은 더 이상 끌어되지 않습니다. 창이 표시되지만 이동하지는 않습니다.

Canvas.GetLeft (this)가 잘못된 숫자를 반환하기 때문에 이동되지 않는 이유가 있습니다. 왜? 이 컨트롤의 대상은 Winforms 앱에서 사용하지만, ElementHost 개입없이 WPF 앱에서이 컨트롤을 사용하면이 동일한 동작을 찾습니다.

편집 - ElementBox를 사용하여 내 Winforms 앱에서이 컨트롤을 직접 호스팅 할 때 창을 이동할 수 있습니다. 그러나 창 투명도가 손실됩니다. 따라서이 양식에 대한 WPF 로의 이전 이유는 모두 유효하지 않습니다.

그래서 내가 잘못 했어 - .dll에서 호스팅되는 컨트롤 내에서 GetLeft를 호출하는 올바른 방법은 무엇입니까?

답변

0

휴. 이 링크를 찾았으므로 이것이 작동하도록하는 데 필요한 대답입니다. 대신 Canvas.GetLeft를 사용

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/281a8cdd-69a9-4a4a-9fc3-c039119af8ed

는, 지금 다음이 컨트롤의 절대 locatin을 얻고 코드를 사용하고하는 경우 이동 컨테이너가 알고 모니터링 할 수있는 이벤트를 발생 :

'// Get absolute location on screen of upper left corner of button 
    Dim locationFromScreen As Point = Me.PointToScreen(New Point(0, 0)) 

    '// Transform screen point to WPF device independent point 
    Dim source As PresentationSource = PresentationSource.FromVisual(Me) 
    Dim targetPoints As System.Windows.Point = source.CompositionTarget.TransformFromDevice.Transform(locationFromScreen) 

    Dim left As Double = targetPoints.X 
    Dim top As Double = targetPoints.Y 

    left += e.HorizontalChange 
    top += e.VerticalChange 

    Canvas.SetLeft(Me, left) 
    Canvas.SetTop(Me, top) 

    'spread the news 
    PaletteMoved(New DockingPaletteEventArgs(left, top, e.HorizontalChange, e.VerticalChange)) 
0

먼저 WinForm 내부에서 WPF 컨트롤을 호스팅하는 것이 좋습니다. WinForm의 모든 테두리 속성을 사용 안 함으로 설정하면 마치 컨트롤 자체가 모든 것처럼 보입니다. 그런 다음이 WinForm을 컨트롤을 사용하는 주요 수단으로 사용하십시오.

이렇게하면 모든 관련 기능에 액세스 할 수 있습니다.

독립 실행 형 Winforms 호스트 안의 요점 >>> XAML. >>> Winform은 다른 Winforms에서 컨트롤로 사용됩니다.

+0

고마워요. 이걸 꼭대기에 올려야합니다. 편집을 추가하겠습니다. 내 Winform 응용 프로그램 내에서 직접 호스팅 할 때 창 투명도가 손실됩니다. 그게 효과가 없을거야 .......... – bperreault