WPF控制Dll问题

WPF控制Dll问题,wpf,Wpf,我已经开始研究一个WPF控件dll,它将从winforms应用程序中引用 我在这个项目中的第一个控件是一个简单的容器控件。它的目标是为Winforms应用程序提供一个无模式、透明的对接窗口 这个控件的问题是,当我试图拖动它时,它无法移动。如果不将它放入.dll,我可以移动它。在dll内部,Canvas.GetLeft-返回一个无效的数字,我不知道如何修复这个问题 以下是此控件的大部分XAML: <Grid Height="Auto"> <Grid.Resourc

我已经开始研究一个WPF控件dll,它将从winforms应用程序中引用

我在这个项目中的第一个控件是一个简单的容器控件。它的目标是为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>
当我从.exe中取出相同的代码并将其放入.dll中,然后引用该.dll并使用来自我的exe的控件时,它将不再拖动。窗口将显示,但不会移动

它不会被移动的原因是因为Canvas.GetLeftthis返回一个无效的数字。为什么?尽管此控件的目标是Winforms应用程序的使用,但在没有任何ElementHost干预的情况下从WPF应用程序使用它时,我发现了相同的行为

编辑-当我使用ElementHost在Winforms应用程序中直接宿主此控件时,我可以移动窗口。但窗户的透明度已经丧失。因此,将此表单移动到WPF的全部原因都是无效的


所以我做错了-从.dll托管的控件中调用GetLeft的正确方法是什么?

我建议您首先在WinForm中托管WPF控件。禁用WinForm的所有边框属性…使您的控件看起来就像它自己一样。然后将此WinForm用作使用控件的主要方法

这样您就可以访问所有相关功能


在一个独立的Winforms主机内的XAML中Winform将用作其他Winforms中的控件。

呼。我找到了这个链接,这就是我需要的答案

我现在使用的代码不是Canvas.GetLeft,而是获取此控件的绝对位置,然后引发一个事件,容器可以监视该事件以知道何时移动:

    '// 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))

谢谢,我应该在上面说这个,我会添加编辑。当我直接在我的Winform应用程序中主持此操作时,我将失去窗口透明度。那是行不通的。。。。。。。。。。
    '// 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))