سؤال

وهنا هو بلدي XAML

<Grid
    Name="grid">
    <TextBlock
        Text="Some Label" />
    <WindowsFormsHost
        Name="winFormsHost">

    </WindowsFormsHost>
</Grid>

في الحمل النموذج I تنفيذ الأسلوب التالي

protected void OnLoad(object sender, RoutedEventArgs e)
{
    // Create a line on the fly
    Line line = new Line();

    line.Stroke = Brushes.Red;
    line.StrokeThickness = 17;

    line.X1 = 50;
    line.Y1 = 50;

    line.X2 = 250;
    line.Y2 = 50;

    this.grid.Children.Add(line);

    System.Windows.Forms.TextBox oldSchoolTextbox = new System.Windows.Forms.TextBox();
    oldSchoolTextbox.Text = "A bunch of Random Text will follow.  ";
    oldSchoolTextbox.WordWrap = true;
    oldSchoolTextbox.Width = 300;

    for (int i = 0; i < 250; i++)
    {
        oldSchoolTextbox.Text += "abc ";

        if (i % 10 == 0)
        {
            oldSchoolTextbox.Text += Environment.NewLine;
        }
    }

    this.winFormsHost.Child = oldSchoolTextbox;
}

وخط يرسم فقط عندما كنت التعليق خارج السطر التالي.

this.winFormsHost.Child = oldSchoolTextbox;

وكيف يمكنني رسم خط حول السيطرة WindowsFormsHost؟

هل كانت مفيدة؟

المحلول

وهناك شيء مايكروسوفت قد يسمى "المجال الجوي" الذي يمنع هذا من الحدوث، على الأقل بسهولة. هنا هي الصفحة WPF إمكانية التشغيل المتداخل واصفا أجواء . [لديه التركيز DX، ولكن ينطبق الشيء نفسه، تماما كما ذكر، لWindowsFormsHost.]

وWindowsFormsHost (عندما يكون لديه طفل) بإنشاء HWND منفصل، والذي يمنع سياق تقديم WPF من عرض في هذا المستطيل.

والخيار الأفضل للعمل حول هذا يتطلب 3.5sp1. NET (على الأقل للعمل بشكل صحيح). يمكنك الحصول على حول هذا عن طريق إنشاء نافذة خلفية شفافة 100٪ منفصل تماما، ووضعه على ويندوز الخاص بك تشكل تحكم المضيف. يمكنك ثم رسم في ذلك، وأنه سيتم عرض بشكل صحيح.

وانها شعور hacky إلى حد ما، لكنه يعمل.

نصائح أخرى

ولقد كان لي نفس المشكلة، وبعد البحث في جميع أنحاء نهاية الامر الى استخدام شفافة 'تراكب نافذة على أعلى WindowsFormsHost. للحفاظ على الإطار الرئيسي الخاص بك متزامنة مع نافذة تراكب تحتاج إلى التعامل مع الأحداث التالية:

والحدث LocationChanged لMainWindow الخاص بك و LayoutUpdated الحدث لعنصر WindowsFormsHost الخاص بك. كل من هذه معالجات الأحداث يجب استدعاء وظيفة التي تتحرك نافذة تراكب شفاف الخاص بك على أعلى النافذة WindowsFormsHost (SyncOverlayPosition () في المثال أدناه).

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   this.LocationChanged += new EventHandler(MainWindow_LocationChanged);
   _windowsFormsHost.LayoutUpdated += new EventHandler(_windowsFormsHost_LayoutUpdated);
}

void MainWindow_LocationChanged(object sender, EventArgs e)
{
   SyncOverlayPosition();
}

void _windowsFormsHost_LayoutUpdated(object sender, EventArgs e)
{
   SyncOverlayPosition();
}

void SyncOverlayPosition()
{
   Point hostTopLeft = _windowsFormsHost.PointToScreen(new Point(0, 0));    

   _overlayWindow.Left = hostTopLeft.X;
   _overlayWindow.Top = hostTopLeft.Y;
   _overlayWindow.Width = _windowsFormsHost.ActualWidth;
   _overlayWindow.Height = _windowsFormsHost.ActualHeight;
}

والجواب المقبول يفعل العمل. لكن المسألة الوحيدة مع ذلك هو أن نافذة شفافة سيتم عرض أكثر من النافذة الرئيسية بلدي. كما أتيحت لي ربط إلى حركة للتأكد من كل شيء بقي على وفاق.

وفعلت شيئا مختلفا قليلا من نافذة شفافة. هذا وعملت في حالتي، ولكن قد لا تعمل دائما.

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

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