ملزمة مربع نص IsFocused إلى منبثقة لبرنامج isopen بالإضافة إلى شروط إضافية

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

سؤال

لدي TextBox و Popup التحكم.أريد Popup.IsOpen الملكية أن تكون ملزمة TextBox.IsFocused مكان الإقامة.وبعبارة أخرى ، إذا كان النص قد تركز المنبثقة مفتوحة.أما إذا كانت منبثقة هو في التركيز ، أنا لا أريد أن أغلق بسبب النص فقدان التركيز.كنت أتمنى أن التعامل مع هذا باستخدام الارتباطات بدلا من الاضطرار إلى التعامل مع هذا في معالجات الأحداث.أيضا ، أن أفعل أي شيء بشأن تبعية خصائص ، لأنها موجودة مسبقا(أيسجل تجاوز الفوقية ، إلخ) ، أو هل يمكنني ربط هذه الخصائص.

هنا بعض التعليمات البرمجية على غرار السيناريو بلدي

StackPanel sp = new StackPanel();
TextBox tb = new TextBox();
Popup popup = new Popup();

sp.Children.Add(tb);
sp.Children.Add(popup);
this.Content = sp;

Binding bd = new Binding("IsFocused");
bd.source = tb.IsFocused;
popup.SetBinding(Popup.IsOpenProperty, bd);

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

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

إذا أنا يمكن أن تعاد صياغة هذا الوضوح أود أن أقول مثل هذا.

1.) ربط Popup.IsOpen إلى TextBox.IsFocused

2.) ربط TextBox.IsFocused إلى Popup.IsFocused(على افتراض أن هذا سيكون مجرد إعطاء التركيز مرة أخرى إلى مربع نص)


هنا هو بلدي الأول C# محاولة في هذا.شيء لا يزال غير صحيح تماما.لا يحدث أي شيء لذلك أنا لست متأكدا من أين الخطأ.

        StackPanel sp = new StackPanel(); 
        TextBox tb = new TextBox(); 
        Popup popup = new Popup();

        TextBox popupTextBox = new TextBox();
        popup.Child = popupTextBox;


        sp.Children.Add(tb); 
        sp.Children.Add(popup); 
        this.Content = sp;


        //***Questions concerning giving the UIElement a name and registering it
        tb.Name = "siblingTextBox";
        System.Windows.NameScope.GetNameScope(tb).RegisterName("siblingTextBox", tb);

        //***Questions concerning giving the UIElement a name and registering it
        popupTextBox.Name = "popupTextBox";
        System.Windows.NameScope.GetNameScope(tb).RegisterName("popupTextBox", popupTextBox);

        Binding binding = new Binding();
        binding.ElementName = tb.Name;
        popup.PlacementTarget = tb;

        Style style = new Style();
        style.TargetType = typeof(Popup);

        DataTrigger dataTrigger = new DataTrigger();
        Binding focusedBinding = new Binding("IsFocused");
        focusedBinding.ElementName = tb.Name;
        dataTrigger.Value = true;
        dataTrigger.Binding = focusedBinding;

        Setter setter = new Setter();
        setter.Property = Popup.IsOpenProperty;
        setter.Value = true;
        dataTrigger.Setters.Add(setter);
        style.Triggers.Add(dataTrigger);

        dataTrigger = new DataTrigger();
        focusedBinding = new Binding("IsFocused");
        focusedBinding.ElementName = popupTextBox.Name;
        dataTrigger.Value = true;
        dataTrigger.Binding = focusedBinding;
        setter = new Setter();
        setter.Property = Popup.IsOpenProperty;
        setter.Value = true;
        dataTrigger.Setters.Add(setter);
        style.Triggers.Add(dataTrigger);

        popup.Style = style;
هل كانت مفيدة؟

المحلول

التعليمة البرمجية التالية يوضح وجود اثنين من مربعات النص في StackPanel ، وضع التركيز إلى أعلى مربع النص فتح المنبثقة.في هذه النقطة ، إذا كنت ثم نقل التركيز إلى مربع النص الوارد في منبثقة سوف تبقى مفتوحة.إذا قمت بنقل التركيز إلى عنصر آخر ، في هذه الحالة مربع النص الثاني في StackPanel, المنبثقة سوف تغلق.كما كنت غير قادر على التركيز المنبثقة نفسها في الواقع أنا ملزم IsFocused خاصية مربع النص في النافذة المنبثقة.

<StackPanel>
    <TextBox x:Name="text" Text="This is a text box" />
    <TextBox Text="Another Text Box" />
    <Popup PlacementTarget="{Binding ElementName=text}">
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=text, Path=IsFocused}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=popupText, Path=IsFocused}" Value="True">
                        <Setter Property="IsOpen" Value="True" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>
        <TextBox x:Name="popupText" Text="HELLO WORLD" />
    </Popup>
</StackPanel>

لتحقيق نفس الشيء في C# لم يكن لديك لاستخدام ElementName الارتباطات كما كنت بالفعل عناصر الحق في متناول اليد.أنا دائما تقريبا تستخدم XAML إلى تعريف العناصر لذلك أنا متأكد من أنك يمكن أن مرتبة هذا قليلا.

var text1 = new TextBox { Name = "text", Text = "This is a text box" };
var text2 = new TextBox { Text = "Another Text Box" };
var popupText = new TextBox { Name = "popupText", Text = "HELLO WORLD" };
var popup = new Popup { Child = popupText, PlacementTarget = text1 };
var stackPanel = new StackPanel();

stackPanel.Children.Add(text1);
stackPanel.Children.Add(text2);
stackPanel.Children.Add(popup);

var popupStyle = new Style(typeof (Popup));
var textIsFocusedTrigger = new DataTrigger
    {
        Binding = new Binding {Source = text1, Path = new PropertyPath("IsFocused")},
        Value = true
    };

textIsFocusedTrigger.Setters.Add(new Setter(Popup.IsOpenProperty, true));

var popupTextIsFocusedTrigger = new DataTrigger
    {
        Binding = new Binding {Source = popupText, Path = new PropertyPath("IsFocused")},
        Value = true
    };

popupTextIsFocusedTrigger.Setters.Add(new Setter(Popup.IsOpenProperty, true));

popupStyle.Triggers.Add(textIsFocusedTrigger);
popupStyle.Triggers.Add(popupTextIsFocusedTrigger);

popup.Style = popupStyle;

آمل أن يساعد هذا!

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