2010-01-04 14 views
6

एक WPF आवेदन में मैं निम्नलिखित व्यवहार जो काम करने के लिए सरल प्रतीत नहीं होता लागू करने के लिए करना चाहते हैं: मुख्य विंडो सेगैर-मोडल संवाद के शीर्ष पर एक मोडल संवाद को सही तरीके से कार्यान्वित कैसे करें?

(Window1) उपयोगकर्ता एक गैर-मोडल विंडो (Window2), और कहा कि गैर खोलता है मोडल विंडो एक मोडल संवाद प्रदर्शित कर सकता है (Window3)।

समस्या यह है कि जब भी मोडल संवाद दिखाया गया है, तब उपयोगकर्ता पृष्ठभूमि में गायब हो जाता है (यह देखते हुए कि अन्य अनुप्रयोगों की खिड़कियां खुली हैं) जब उपयोगकर्ता संवाद बंद कर देता है।

क्या मैं Window.Owner और Window.Show()/Window.ShowDialog() का उपयोग करने में कुछ भी गलत है, क्या यह एक बग है या क्या यह कुछ समर्थित नहीं है?

निम्नलिखित सरल WPF आवेदन इस व्यवहार को दर्शाता है:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Window2 win = new Window2(); 
     win.Owner = this; 
     win.Show(); 
    } 
} 

public partial class Window2 : Window 
{ 
    public Window2() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Window3 win = new Window3(); 
     win.Owner = this; 
     win.ShowDialog(); 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

public partial class Window3 : Window 
{ 
    public Window3() 
    { 
     InitializeComponent(); 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

XAML Window1:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1"> 

    <Button Click="Button_Click">Show non-modal window</Button> 
</Window> 

XAML Window2:

<Window x:Class="WpfApplication1.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window2"> 
    <StackPanel> 
     <Button Click="Button_Click">Show modal dialog</Button> 
     <Button Name="btnClose" Click="btnClose_Click">Close</Button> 
    </StackPanel> 
</Window> 

XAML Window3:

<Window x:Class="WpfApplication1.Window3" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window3"> 

    <Button Name="btnClose" Click="btnClose_Click">Close</Button> 
</Window> 

अद्यतन: फिक्स्ड कॉपी & कोड में पेस्ट त्रुटि। यदि यह महत्वपूर्ण है तो यह .NET 3.5 SP1 है।

उत्तर

8

माइक्रोसॉफ्ट confirms this as a bug WPF में:

यह पिछले संस्करण की एक प्रतिगमन तो यह बार उत्पाद के इस संस्करण के लिए निर्धारित किया जा करने के लिए नहीं है नहीं है। भविष्य में रिलीज के लिए हम इसे देखेंगे।

इस बीच, जब बच्चे की खिड़की बंद हो रही है तो मालिक विंडो को सक्रिय करके इसे चारों ओर काम किया जा सकता है।

नमूना कोड:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void NonModalButtonClick(object sender, RoutedEventArgs e) 
    { 
     new Window1 { Owner = this }.Show(); 
    } 

    private void ModalButtonClick(object sender, RoutedEventArgs e) 
    { 
     new Window1 { Owner = this }.ShowDialog(); 
    } 

    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     if (this.Owner != null) 
     { 
      this.Owner.Activate(); 
     } 
    } 
} 

(ध्यान दें कि वैकल्पिक हल हमेशा अग्रभूमि में मुख्य विंडो जो अपेक्षित व्यवहार से भिन्न हो सकता लाएगा)

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