سؤال

لدي حاليا تطبيق WinForms الذي يعتمد على تأثيرات شوكية. ومع ذلك يثبت أن هذا هو ألم مطلق في الديمقلي وراء! WinForms كما تعلم IM لا يتعامل مع الشفافية بشكل جيد بشكل جيد.

كنت أتساءل عما إذا كان هذا سيكون أسهل في استخدام مكونات 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 Control User User) لاستدعاء التعليمات البرمجية على الأصل للتحكم WPF.

اهم الاشياء اولا...

  • هل هذا شيء معقول يجب القيام به أو أنا ينبح الشجرة الخطأ؟
  • هل يمكن تحقيق ذلك بطريقة أسهل؟
  • يمكن لأي شخص أن يساعدني هنا؟ (سيتم استلام نموذج التعليمات البرمجية بامتنانه!)
  • أخيرا ... هل هناك أي موارد عبر الإنترنت التي يمكن أن تساعدني أ) تعلم WPF و B) أكثر كفاية ذاتيا؟
هل كانت مفيدة؟

المحلول 2

هنا الحل الذي اعتدت عليه حل المشكلة في متناول اليد. يعتمد هذا الحل على التحكم في التراكب لتقديم الوالدين كصورة نقطية. ثم يتم رسم ذلك كخلفية للتحكم التراكب.

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 لتقديمها كما هو مطلوب. لا يوجد حاليا تحديث لتحديث الصورة النقطية عند التغييرات الأصل، ومع ذلك، يجب أن تكون تافهة لإنشاء طريقة مخصصة تقوم بمسح الصورة النقطية وإعادة تشغيل عنصر التحكم Overling. ليس حلا أنيقا أدرك ... ولكن يبدو أنه يعمل بشكل جيد بما فيه الكفاية.

نصائح أخرى

بالتأكيد ممكن، وأعتقد أنك محق في أنه سيكون أسهل طريقة للعمل مع الشفافية.

أنا لم أحاول ذلك بنفسي، ولكن وفقا لهذه المقالة عن الشفرة, ، يجب أن تكون بسيطة جدا. يجب عليك استخدام السيطرة elementhost لاستضافة محتوى WPF الخاص بك.

استضافة WPF في عنصر تحكم WinForms هو سيناريو مدعوم، وهي ميزة مضة في الإطار. لذلك يجب ألا تكون هناك مشاكل في القيام بذلك. يوجد أيضا مكون WPF للذهاب في الاتجاه الآخر، استضافة WinForms في تطبيق WPF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top