Я начал работу над dll-элементами управления WPF, на которые будут ссылаться приложения 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>
Я подключил событие Thumb 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, я нахожу такое же поведение, когда использую его из приложения WPF без какого-либо вмешательства ElementHost.
Редактировать - когда я размещаю этот элемент управления непосредственно в своем приложении Winforms, используя ElementHost, я могу перемещать окно. Но прозрачность окна теряется. И поэтому вся причина перехода на WPF для этой формы неверна.
Итак, я сделал это неправильно - как правильно вызвать GetLeft из элемента управления, размещенного на .dll?