WPF Controls Dll вопрос - PullRequest
       13

WPF Controls Dll вопрос

1 голос
/ 19 августа 2009

Я начал работу над 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?

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

Уф. Я нашел эту ссылку, и это тот ответ, который мне нужен, чтобы заставить это работать.

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

Вместо использования 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))
0 голосов
/ 19 августа 2009

Я предлагаю вам сначала разместить элемент управления WPF внутри WinForm.Отключите все свойства границы WinForm ... чтобы ваш элемент управления выглядел так, как будто он сам по себе.Затем используйте эту WinForm в качестве основного средства использования вашего элемента управления.

Таким образом, вы получите доступ ко всем связанным функциям.

В gist >>> XAML внутри автономного хоста Winforms.>>> Winform для использования в качестве контроля в других Winforms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...