2012-12-11 10 views
5

परिदृश्य

मैं है इस परिदृश्य पर (मैं इसे नीचे एक नमूना आवेदन करने के लिए छीन लिया गया है):एक WinForms नियंत्रण से एक फार्म बनाया जा रहा है WPF में होस्ट की गई - स्वामी सेट नहीं है

  • एक WPF एक विंडो के साथ आवेदन (मेनविंडो) WinForms UserControl (उपयोगकर्ता नियंत्रण 1) होस्ट करना।
    • नियंत्रण एक WindowsFormsHost
  • UserControl1 के पीछे कोड में गतिशील रूप से जोड़ा जाता है एक बटन जो एक रूप (Form1)
    • यह form1.Show(this) का उपयोग करता है खोलता है।

समस्या है:

  • Form1 के .Owner संपत्ति रिक्त है।
    • असली आवेदन में, कुछ काम .Owner संपत्ति मैं सिर्फ इस समस्या को नजरअंदाज नहीं कर सकते हैं जिसका मतलब है को शामिल किया जाता है। आदर्श रूप में, ज़ाहिर है, यहां कोई निर्भरता नहीं होगी।
    • असली एप्लिकेशन में, मेरे पास इस कोड के WinForms पक्ष पर नियंत्रण नहीं है। हमारा डब्ल्यूपीएफ एप्लीकेशन किसी अन्य टीम के WinForms नियंत्रण की मेजबानी कर रहा है।
    • नोट्स:
      • जब मैं एक WinForms मेजबान के बजाय का उपयोग करें, .Owner संपत्ति ठीक से सेट है।
      • UserControl1 अन्य सभी मायनों में ठीक होस्ट किया गया है - में और वास्तविक आवेदन सब कुछ ठीक काम करता है, यह सिर्फ उस प्रपत्र उपयोगकर्ता नियंत्रण एक उचित स्वामी नहीं है द्वारा खोला है।

मैं समझ सकता क्यों कुछ समस्या है, यहाँ, लेकिन मैं अपने अगले सवाल का जवाब आशा करती हूं कि हो सकता है 'हां'!

क्या मैं इस समीकरण के WPF तरफ परिवर्तन करके काम करने के लिए प्राप्त करने के लिए कर सकते हैं?

असफल कि, कुछ भी WinForms पक्ष पर किया जा सकता है? (यह संभावना के क्षेत्रों है कि मैं कुछ भी परिवर्तन नहीं लागू किया हो सकता है परे नहीं है ...)

नमूना कोड

यहाँ मेरी नमूना अनुप्रयोग में कोड है। सबसे पहले WPF पक्ष:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="700"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Button Name="btnAdd" Click="btnAdd_Click" Content="Add Winform"/> 

     <WindowsFormsHost Grid.Row="1" Name="host" ScrollViewer.CanContentScroll="False"/> 
    </Grid> 
</Window> 
public partial class MainWindow : Window 
{ 
    private WindowsFormsHost host; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     UserControl1 uc1 = new UserControl1(); 
     WindowsFormsHost.EnableWindowsFormsInterop(); 
     this.host.Child = uc1; 

    } 
} 

और अब WinForms ओर ...

उपयोगकर्ता नियंत्रण 1 केवल एक बटन और उसके साथ एक लेबल के साथ एक उपयोगकर्ता नियंत्रण है। कोड यह रहा:

public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form1 form1 = new Form1(); 
      form1.Show(this); 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      this.label1.Text = "this: " + this + Environment.NewLine + "parent: " + this.Parent + Environment.NewLine + "toplevelcontrol: " + this.TopLevelControl; 
     } 
    } 

Form1 सिर्फ एक खाली रूप है।

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     MessageBox.Show(" this: " + this + " owner: " + this.Owner); 
    } 
} 

Owner संदेश बॉक्स में दिखाया गया है और TopLevelControl लेबल में दिखाया गया null जब WPF में होस्ट कर रहे हैं, लेकिन जब एक और WinForms आवेदन में आयोजित एक मूल्य की है।

आगे की जांच पड़ताल

मुझे लगता है कि समस्या है कि यहाँ .Owner प्रकार Form की है और वहाँ WPF आवेदन में इस प्रकार का कोई उदाहरण नहीं है। कल्पना करना मुश्किल है कि इस परिदृश्य में संपत्ति का वैध मूल्य क्या हो सकता है। ऐसा लगता है कि, मुझे लगता है कि कोड को बदलने की जरूरत है जो फॉर्म ' में `ओनर' संपत्ति तक पहुंच रहा है।

उत्तर

1
<Window 
    xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
> 

<my:WindowsFormsHost Name="MapHost" ScrollViewer.CanContentScroll="False" SizeChanged="MapHost_SizeChanged" /> 

MapControl System.Windows.Forms.Control विरासत

MapHost.Child = MapControl; 
+0

इस के लिए धन्यवाद - हालांकि, मैं पहले से ही मेरे ** btnAdd_Click() ** विधि में WindowsFormsHost उपयोग कर रहा हूँ। मैंने मेजबान नियंत्रण को सीधे एक्सएएमएल में घोषित करने का प्रयास किया है, लेकिन मुझे अभी भी मालिक के बिना आने वाले फॉर्म खोलने में समस्या है। मैं अपने प्रश्न में इसे स्पष्ट करने की कोशिश करूंगा। – doornail

+0

ठीक है, मैंने अपने प्रश्न को संशोधित करने के लिए XAML में WindowsFormsHost को ** btnAdd_Click() ** में तुरंत चालू करने के बजाय संशोधित किया है। दुर्भाग्य से, मुझे अभी भी वही समस्या मिलती है। – doornail

+0

@doornail ... क्या आपने स्वामी को सेट करने का प्रयास किया ??? MyForm.Owner = यह (WPF विंडो); – 0x4f3759df

संबंधित मुद्दे