C # Winforms-WPF взаимодействия - PullRequest
2 голосов
/ 01 июня 2009

В настоящее время у меня есть приложение Winforms, которое использует прозрачные эффекты. Тем не менее, это оказывается абсолютной болью в предыдущей стадии позади! Winforms, поскольку я учусь, не очень хорошо справляется с прозрачностью.

Мне было интересно, будет ли легче использовать компоненты WPF для бита прозрачности и winforms для остальных (заметьте, хотя я хотел бы переместить все приложение в WPF, это просто нереально!). Я почти ничего не знаю о WPF, поэтому я здесь! То, что я рассматривал, было:

1) Разместите компонент WPF в пользовательском элементе управления Winforms, например, Пример управления WPF:

<UserControl x:Class="WindowsFormsApplication1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
         <Rectangle Name="rectangle1" Stroke="White" Fill="Black" RadiusX="10" RadiusY="10" Opacity="0.7" />
        <Rectangle Margin="57,101,43,99" Name="dialog" Stroke="Gray" Fill="White" RadiusX="10" RadiusY="10" />
    </Grid>
</UserControl>

2) Разместите пользовательский элемент управления Winforms (содержимое) в белом прямоугольнике (диалоге) элемента управления WPF. 3) разрешить контенту (пользовательский элемент управления Winforms) вызывать код на родительском элементе WPF-Control.

Перво-наперво ...

  • Разумно ли это делать или я лаю не на том дереве?
  • Можно ли это сделать проще?
  • Может ли кто-нибудь помочь мне здесь? (Образец кода будет с благодарностью получен!)
  • Наконец ... есть ли онлайн-ресурсы, которые могут мне помочь: а) изучить WPF и б) стать более самодостаточным?

Ответы [ 2 ]

4 голосов
/ 01 июня 2009

Это, конечно, возможно, и я думаю, что вы правы, что это будет самый простой способ работать с прозрачностью.

Я сам не пробовал, , но, согласно этой статье о CodeProject , все должно быть довольно просто. Вам следует использовать элемент управления ElementHost для размещения содержимого WPF.

Размещение WPF в элементе управления WinForms - это поддерживаемый сценарий, функция, встроенная в платформу. Так что в этом не должно быть проблем. Существует также компонент WPF для перехода в другую сторону, размещения WinForms в приложении WPF.

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

Вот решение, которое я использовал для решения данной проблемы. Это решение основывается на наложении элемента управления для отображения его родительского элемента в виде растрового изображения. Это тогда окрашено как фон наложенного контроля.

public class OverlayingControl : UserControl
{
    /// <summary>
    /// Overrides the c# standard Paint Background to allow the custom background to be drawn 
    /// within the OnPaint function
    /// </summary>
    /// 
    /// <param name="e">Arguements used within this function</param>
    protected override void OnPaintBackground( PaintEventArgs e )
    {
        //Do Nothing 
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        // Render the Parents image to a Bitmap. NB: bitmap dimensions and Parent Bounds can be changed to achieve the desitred effect
        Bitmap background = new Bitmap( Width, Height, PixelFormat.Format64bppArgb );
        Parent.DrawToBitmap( background, Parent.Bounds );

        // Paint background image             
        g.DrawImage( background, 0, 0, new RectangleF( Location, Size ), GraphicsUnit.Pixel );

        // Perform any alpha-blending here by drawing any desired overlay e.g.
        // g.FillRectangle( new SolidBrush( semiTransparentColor ), Bounds);
    }

}

Это выполняется исключительно в домене WinForms, однако я считаю, что было бы возможно передать это растровое изображение в элемент управления WPF для рендеринга по мере необходимости. В настоящее время не предусмотрено обновление битовой карты при изменении родительского элемента. Однако создание пользовательского метода, который очищает битовую карту и повторно рисует элемент управления Overlayng, должно быть тривиальным. Я понимаю, что это не элегантное решение, но оно работает достаточно хорошо.

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