WPF LOSTFOCUS لا تطلق النار بشكل صحيح مقابل 2001 TreeViewItem

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

  •  20-09-2019
  •  | 
  •  

سؤال

لدي متداخل TreeView حيث أقوم بربط حدث DoubleClick على كل عنصر بحيث يتم تغيير نص العقدة إلى مربع نص قابل للتحرير. ثم أستخدم HostFocus EventHandler لإزالة مربع النص واستعادة النص.

  void treeViewItemWithMenu_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (selected == e.Source)
        {
            TextBox tb = new TextBox();
            tb.Text = this.Header.ToString();
            tb.Focus();
            tb.LostFocus += new RoutedEventHandler(tb_LostFocus);
            this.Header = tb;
            var a = e.OriginalSource;
            e.Handled = true;
        }
    }


    void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        this.Header = ((TextBox)(this.Header)).Text;
    }

بشكل غير مريح ، لا يبدو أن حدث LostFocus يعمل بشكل صحيح. عندما أنقر خارج مربع النص ، فإنه لا يطلق النار على الإطلاق. يمكنني حتى DoubleClick على عقدة أخرى وتدخل في وضع التحرير (أي يصبح مربع نص) بينما يبدو أن مربع النص الأول لا يزال لديه التركيز. التركيز المفقود لا يطلق النار حتى أبدأ في الذهاب ذهابًا وإيابًا بين مربعين نصين.

أنا أستخدم VS2010 RC مع تعيين المشروع على .NET 3.5.

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

المحلول

يا بلدي! عفوا ، قولتي ، لكن كل مستخدم منتظم WPF الذي قرأ سؤالك قد اهتز برأسه على الأرجح. نشعر بالحزن عليك لأنك لم تتعلم بعد "Zen of WPF" الحقيقي ، وهو الاستفادة من ربط البيانات والقوالب والمشغلات لجعل واجهة المستخدم ديناميكية بدلاً من القيام بذلك بالطريقة القديمة. WPF جميل بسبب هذه القدرة. كما أنه يجعل الأشياء "1000 ٪" أسهل.

أوصيك بتغيير واجهة المستخدم الخاصة بك لاستخدام مشغل على TreeViewItem لاستبدال headertemplate استنادًا إلى خاصية تحددها في TreeViewItem. اضبط هذه الخاصية صحيحًا عند النقر نقرًا مزدوجًا على العنصر. قم بتعيينها خطأ عندما يذهب iskeyboardfocuswithin كاذب (يمكنك تجاوز البيانات الوصفية وإضافة propertyChangedCallback لهذا الغرض).

فيما يتعلق بمشكلتك المفقودة ، أظن أن مشكلتك هي أن لديك نطاقات تركيز متعددة أو أنها خطأ في RC. دون رؤية XAML الخاص بك لا أستطيع أن أقول أكثر من ذلك بكثير.

تفاصيل إضافية حول القيام بذلك "WPF Way"

فيما يلي بعض التفاصيل حول كيفية تنفيذ هذا باستخدام خاصية ومحفزات وقوالب متصلة.

يمكن أن تكون القوالب الخاصة بك بسيطة أو معقدة كما تريد. هنا بسيط:

<DataTemplate x:Key="NormalTemplate">
  <ContentPresenter />
</DataTemplate>

<DataTemplate x:Key="TextBoxTemplate">
  <TextBox Text="{Binding}" />
</DataTemplate>

هذا هو شكل أسلوبك:

<Style TargetType="TreeViewItem">
  <Setter Property="HeaderTemplate" Value="{StaticResource NormalTemplate}" />
  <Trigger Property="local:MyWindowClass.ShowTextBox" Value="true">
    <Setter Property="HeaderTemplate" Value="{StaticResource TextBoxTemplate}" />
  </Trigger>
</Style>

يمكن إنشاء الخاصية المرفقة "showtextbox" في mywindowclass باستخدام مقتطف "propa" - فقط اكتب "propa" وضرب علامة التبويب ، ثم املأ الفراغات.

لتبديل العنصر لإظهار مربع النص ، فقط:

SetShowTextBox(item, true);

لإعادة تشغيله:

SetShowTextBox(item, false);

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

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