2009-08-19 83 views
1

我已經開始工作的WPF控件的DLL將從winforms應用程序引用。WPF控件的DLL問題

我在這個項目中的第一個控件是一個簡單的容器控件。它的目的是爲Winforms應用程序提供一個無模式,透明的對接窗口。

我對這個控件的問題是,當我嘗試拖動它時我無法讓它移動。如果我不把它放到.dll中,我可以移動它。在dll裏面,Canvas.GetLeft - 返回一個無效的數字,我不知道如何解決這個問題。

這裏是XAML的此控件的批量:

<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事件背後,並用它來拖動該窗口。 當我在相同的.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然後引用.dll和使用來自我的exe文件的控制 - 它不會拖了。該窗口顯示但不會移動。

它不會被移動的原因是因爲Canvas.GetLeft(this)返回一個無效數字。爲什麼?儘管此控件的目標是由Winforms應用程序使用,但是當我在沒有任何ElementHost干預的情況下從WPF應用程序使用它時,我發現了相同的行爲。

編輯 - 當我使用ElementHost直接在我的Winforms應用程序中託管這個控件時,我可以移動窗口。但窗口透明度已經丟失。因此,向WPF移植此表單的所有理由都是無效的。

所以我做了這個錯誤 - 從一個.dll託管的控件中調用GetLeft的正確方法是什麼?

回答

0

Whe。我發現這個鏈接,這是我需要這個工作的答案。

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

而不是使用Canvas.GetLeft的,我現在使用的代碼獲得此控件的絕對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 2009-08-19 14:07:59