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