لماذا WPF المنبثقة إغلاق عند المنطقة الخلفية هو والنقر ؟

StackOverflow https://stackoverflow.com/questions/619798

  •  03-07-2019
  •  | 
  •  

سؤال

لدي WPF Popup التحكم الذي يحتوي على بعض الضوابط التحرير (مربعات القائمة ومربعات النصوص خانات الاختيار) وضعت قليل بيضاء.

Popup.StaysOpen يتم تعيين False, الذي هو مطلوب.إذا كان المستخدم بالنقر في أي مكان آخر في التطبيق ، تحرير العملية ينبغي النظر في إحباط و المنبثقة يجب أن تغلق.

للأسف المنبثقة أيضا يغلق عندما ينقر المستخدم داخل المنطقة الخلفية من النوافذ المنبثقة (الفضاء بين تحرير عناصر التحكم).

لقد حاولت وضع المنبثقة تكون Focusable.كما حاولت تحديد المنبثقة الطفل (a Border) أن يكون قابل للتركيز.لا حظ إما على الجبهة.

وعلاوة على ذلك, الماوس الحدث يبدو أن النفق من خلال نافذة منبثقة.أيا كان العنصر هو تحت المنبثقة عند النقر فوق يصبح التركيز.هذا على الرغم من كل Popup و Border (الذي أنا النقر) وجود كل من IsHitTestVisible و Focusable تعيين true.

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

المحلول

في النهاية، وجدت أن ما يلي عملت. ونظرا ...

<Popup x:Name="_popup"
       StaysOpen="False"
       PopupAnimation="Slide"
       AllowsTransparency="True">

... اعتدت هذا الرمز في منشئ بعد استدعاء InitializeComponent ...

// Ensure that any mouse event that gets through to the
// popup is considered handled, otherwise the popup would close
_popup.MouseDown += (s, e) => e.Handled = true;

نصائح أخرى

فإنه لا يبدو غريبا أنه تجاهل القابل للتركيز على قافزة والحدود. وكنت قادرا على إصلاح المشكلة عن طريق تغيير StaysOpen في مشغل عندما الماوس فوق الحدود:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ToggleButton x:Name="btnPop" Content="Pop!" Width="100" Height="50"/>
    <Popup Placement="Bottom" PlacementTarget="{Binding ElementName=btnPop}" IsOpen="{Binding IsChecked, ElementName=btnPop}">
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Setter Property="StaysOpen" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsMouseOver, ElementName=brd}" Value="True">
                        <Setter Property="StaysOpen" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>
        <Border x:Name="brd" Background="White" BorderThickness="1" BorderBrush="Black">
            <StackPanel>
                <TextBox Margin="10"/>
                <TextBlock Text="Some text is here." Margin="10"/>
                <TextBox Margin="10"/>
            </StackPanel>            
        </Border>
    </Popup>
</Grid>

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

لا لديك قافزة الخاص متداخلة في ToggleButton أو نوع آخر من زر؟ ثم وقف حالة توجيه على مستوى قافزة سيكون من المنطقي للحصول على العمل.

يمكنك تعيين StayOpen=صحيح ، وتحديد توقيت في المنبثقة الحدث MouseLeave الموقت.Start () ، مثل بعد 3 ثواني إغلاق هذا الإطار ، في MouseEnter الحدث جهاز ضبط الوقت.وقف().أنه سوف يعمل.

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