سؤال

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

إليك رمز C# الخاص بي لإنشاء وإضافة ElementHold إلى عنصر التحكم الأصل:

// This is my WPF control
m_TabHostPanel  = new TabHostPanel();
m_ElementHost  = new ElementHost
                 {
                     Child = m_TabHostPanel,
                     Dock = DockStyle.Top,
                     Height = 34
                 };
this.Controls.Add( m_ElementHost );

يحتوي عنصر التحكم الأصل على عناصر تحكم WinForms الأخرى التي تتم إضافتها وإزالتها في وقت التشغيل ، حسب الحاجة. يتم استضافتها جميعها منفردة مع وضع قفص الاتهام إلى dockstyle.fill. وبالتالي ، في كل مرة أقوم فيها بإضافة واحدة ، أرسل ElementHost إلى الجزء الخلفي من الترتيب z للتأكد من أنها تقدم بشكل صحيح:

m_ElementHost.SendToBack();

وبالتالي ، أعلم أنني لا أواجه مشكلة في المجال الجوي ، أو أي شيء من هذا القبيل.

الشيء الوحيد الذي كنت أتساءل عنه هو: في المشروع الأصلي ، تم دمج أنماط جميع عناصر التحكم التي لا تطلعي في قاموس الموارد للتطبيق في app.xaml ، مثل هذا:

<Application x:Class="WpfTestApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Application/UserInterface/DataTemplates/TabModelDataTemplate.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/HoverablePressableButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/MiniControlButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabCloseButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollLeftButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollRightButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabListDropDownButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabHostComboBoxStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabHostPanelStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

لقد قمت بترحيل App.xaml إلى مشروع WinForms الخاص بي ، ولكن تم تعيين إجراء البناء على الصفحة. إذا قمت بتعيينه على Application Definition ، فستحصل على خطأ في قول أن التطبيق له نقاط دخول متعددة ، وهذا أمر منطقي ، لكنني أتساءل بعد ذلك إذا تم التقاط الأنماط ، وما إلى ذلك. إذا لم يكن هذا قد يفسر لماذا أحصل على مستطيل رمادي فارغ حيث يجب أن يكون سيطرتي لأنه ، بدون هذه ، لا يوجد شيء لتحديد مظهره. لذلك ربما يكون السؤال هو ، كيف يمكنني الحصول على هذه الأنماط في تطبيق WinForms الخاص بي حتى تتمكن عناصر التحكم في WPF الخاصة بي؟

ربما ينبغي أن أذكر أيضًا أن هذا يعمل على .NET FX 3.5.

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

شكرا جزيلا!

بارت

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

المحلول

شكرًا على الرد ، لكنني أعتقد أنك قد تسيء فهمني: أحاول استخدام عنصر مخصص ، عادةً ما تكون مواردها في كائن التطبيق ، وليس إدراج التطبيق نفسه في ElementHost.

لحسن الحظ ، وجدت إجابة:

http://drwpf.com/blog/2007/10/05/managing-application-resources-when-wpf-is-hosted/

نسخة مختصرة:

  • اضبط إجراء بناء للتطبيق. xaml إلى الصفحة
  • في الكود وراء App.xaml ، قم بإنشاء مُنشئ افتراضي يستدعي فقط initializeComponent ()
  • عندما يبدأ تطبيق WinForms ، ما عليك سوى إنشاء مثيل لفئة التطبيق.

ثم كل شيء جيد: يظهر التحكم في WPF كما ينبغي.

الآن ، لماذا أجد الإجابة فقط بعد، بعدما لقد نشرت في Stackoverflow؟

شكرًا لك مرة أخرى،

بارت

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