Вопрос

В настоящее время у меня есть приложение 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.

Сначала о главном...

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

Решение 2

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

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, должно быть тривиальным.Я понимаю, что это не очень элегантное решение...но, похоже, это работает достаточно хорошо.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top