ডাব্লুপিএফ: কীভাবে প্রোগ্রামিয়ালি কোনও পাঠ্যবক্স থেকে ফোকাস সরানো যায়


96

আমি আমার ডাব্লুপিএফের সাথে একটি সহজ (অন্তত আমি ভেবেছিলাম এটির) আচরণ যুক্ত করতে চাই TextBox

যখন ব্যবহারকারী এস্কেপ চাপবে আমি চাই যে TextBoxতিনি সম্পাদনা করছেন যখন এটি সম্পাদনা করা হয়েছে যখন ব্যবহারকারী সম্পাদনা শুরু করেছিলেন, এবং আমি ফোকাসটি মুছে ফেলতে চাই এটির থেকে TextBox

সম্পাদনার শুরুর দিকে মানটির পাঠ্য নির্ধারণ করতে আমার কোনও সমস্যা নেই।

সমস্যাটি হ'ল উপাদানটির ফোকাস সরানো। আমি অন্য কোনও উপাদানগুলিতে ফোকাসটি সরিয়ে নিতে চাই না, আমি কেবল TextBoxফোকাসটি হারাতে চাই । ফোকাসটি সেট TextBoxকরতে আমার কি কোনও অদৃশ্য উপাদান থাকতে হবে যাতে আমার ফোকাসটি হারাতে পারে?

উত্তর:


153

নেট ফ্রেমওয়ার্ক 4 এ Keyboard.ClearFocus();


4
এই সন্ধ্যায় আমি ঠিক কী খুঁজছিলাম!
জোশ

9
এটি সর্বদা ফোকাসকে পরিষ্কার করে না: আমার কোনও সমস্যা আছে যেখানে আমি Keyboard.ClearFocus()কোথাও ক্লিক করার পরে কোড-পেছন থেকে চালিত হয়ে গেলে তালিকাবক্সের অভ্যন্তরে একটি স্বয়ংসম্পূর্ণ টেক্সটবক্স মনোযোগ হারায় না ।
আনভিস ভেবে দেখেন যে এসই খারাপ

4
ClearFocusGotFocusএটি এখনও অন্য নিয়ন্ত্রণের জন্য আগুন লাগিয়ে দেওয়ার জন্য সম্প্রতি দৃষ্টি নিবদ্ধ করা নিয়ন্ত্রণের জন্য অগ্নিকাণ্ডের কারণ নয়। এটি আমার কাস্টম অনস্ক্রিন কীবোর্ডের জন্য একটি বড় সমস্যা, উদাহরণস্বরূপ। এটি ক্যারেটটি অদৃশ্য হয়ে যায়, যা সম্ভবত "কীবোর্ড ফোকাস" অন্তর্ভুক্ত। হতে পারে আমি "মাউস ফোকাস" এর মতো কিছুতে আরও আগ্রহী।
গ্রেট

4
আপনাকে গ্রেট ধন্যবাদ, আমিও একই সমস্যা পেয়েছি। আমি যে সেরাটি নিয়ে এসেছি তা হ'ল আরও কিছু নিয়ন্ত্রণের সাথে ফোকাস সরিয়ে নেওয়া other.Focus()
টোর ক্লিংবার্গ

7
@ গ্রেট এটি কেবল কীবোর্ড ফোকাসকে সাফ করে, লজিক্যাল ফোকাসকে নয় (যা GotFocusঘটনাকে আগুন ধরিয়ে দেয় )। আপনার প্রোগ্রামে সবসময় যৌক্তিক ফোকাস সহ কিছু থাকে। হয় LostKeyboardFocusইভেন্টটি ব্যবহার করুন বা কীবোর্ড ফোকাস সাফ করার আগে অন্য উপাদানটিতে ফোকাস স্থানান্তর করুন (যা এর সাথে যৌক্তিক ফোকাস স্থানান্তর করে)।
চিরিমোরিন

56

আমি যে কোডটি ব্যবহার করছি তা:

// Move to a parent that can take focus
FrameworkElement parent = (FrameworkElement)textBox.Parent;
while (parent != null && parent is IInputElement && !((IInputElement)parent).Focusable)
{
    parent = (FrameworkElement)parent.Parent;
}

DependencyObject scope = FocusManager.GetFocusScope(textBox);
FocusManager.SetFocusedElement(scope, parent as IInputElement);

4
এই কোডটি দুর্দান্ত, কীবোর্ড.ক্লেয়ারফোকাস () এর কিছু অযাচিত পার্শ্ব প্রতিক্রিয়া রয়েছে
প্যাট্রিক

শর্তটি কেন! ((IInputElement) পিতা বা মাতা) .মুগ্ধ ""! সামনে? পিতা-মাতা মনোনিবেশযোগ্য হলে এই অবস্থাটি কি সত্য হওয়া উচিত নয়?
Mert Akcakaya

Mert - নিশ্চিত নয় তবে কেবল এই পোস্টটির মাধ্যমে ব্রাউজ করা শর্তটি সত্য না হওয়া পর্যন্ত লুপিং চালিয়ে মনে হচ্ছে point এইভাবে প্রথম ফোকাসযোগ্য আইটেমটি লুপটি সমাপ্ত করে।
jpierson

4
@ পেট্রিক, কোন অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া? আপনি কি প্রাসঙ্গিক উদাহরণ দিতে পারেন?
অ্যানভেস

4
এটি একটি দুর্দান্ত সমাধান। কীবোর্ড.ক্লেয়ারফোকাস () নিয়ে আমারও সমস্যা ছিল। কোনও মডেল উইন্ডোর ভিতরে টেক্সটবক্সে ক্লিয়ারফোকস () চালানোর সময়, এটি পাঠ্যবক্স এবং উইন্ডো উভয়কেই ফোকাস হারাতে বাধ্য করে। অর্থ কীডাউন ইভেন্টগুলি উইন্ডোতে আর যায় না। এটি পরিবর্তিত করে যাতে ফোকাসটি পিতামাতার (যা উইন্ডো হতে পারে) পরিবর্তিত হয়, ভবিষ্যতের কীডাউন ইভেন্টগুলি হারিয়ে যায় না। আমার ব্যবহারিক উদাহরণে, আমার উইন্ডোটি "কী.এস্কেপ" খুঁজছেন এবং ক্লোজ () কল করছেন। আপনি কোথাও ক্লিয়ারফোকস () চালিয়ে গেলে এটি কাজ করা বন্ধ করে দেয়।
ডেনিস পি

19

পার্টিতে কিছুটা দেরি হয়েছিল, তবে এটি আমার পক্ষে সহায়ক ছিল তাই এখানে এটি চলে।

নেট। 3.0 থেকে, FrameworkElementএকটি মুভফোকাস ফাংশন রয়েছে যা আমার জন্য কৌশলটি করেছে।



"নিশ্চিত হয়ে নিন যে আপনি এই পদ্ধতির রিটার্ন মানটি পরীক্ষা করেছেন false যদি ট্র্যাভারসাল কোনও নিয়ন্ত্রণের রচনা দ্বারা সংজ্ঞায়িত একটি ট্যাব স্টপে চালিত হয় এবং ট্র্যাভার্সাল অনুরোধটি মোড়ানোর অনুরোধ না করে তবে মিথ্যাটির ফেরতের মান ফিরে পাওয়া যেতে পারে।" - এমএসডিএন.মাইক্রোসফটকম
en

16

যেহেতু উপরের উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করে নি এবং গৃহীত উত্তরগুলি কেবল একটি কীবোর্ড ফোকাসের জন্য কাজ করে না, তাই আমি নিম্নলিখিত পন্থায় এসেছি:

// Kill logical focus
FocusManager.SetFocusedElement(FocusManager.GetFocusScope(textBox), null);
// Kill keyboard focus
Keyboard.ClearFocus();

উভয়কেই মেরে ফেলেছে, যৌক্তিক পাশাপাশি কীবোর্ড ফোকাসকে।


9

আপনি ফোকাসযোগ্য পূর্বপুরুষের উপর ফোকাস সেট করতে পারেন। এই কোডটি টেক্সটবক্সে একই টেমপ্লেটের অভ্যন্তরে কোনও ফোকাসযোগ্য পূর্বপুরুষ না থাকলেও কাজ করবে:

DependencyObject ancestor = textbox.Parent;
while (ancestor != null)
{
    var element = ancestor as UIElement;
    if (element != null && element.Focusable)
    {
        element.Focus();
        break;
    }

    ancestor = VisualTreeHelper.GetParent(ancestor);
}

6

আফাইক, ফোকাসটি সম্পূর্ণরূপে অপসারণ করা সম্ভব নয়। আপনার উইন্ডোতে কিছুতে সর্বদা ফোকাস থাকবে।


2

উইন্ডোজ ফোন ডেভেলপমেন্ট, আমি ঠিক কি Focus()বা this.Focus()মধ্যে PhoneApplicationPage এবং এটি একটি যাদুমন্ত্র মত কাজ করেন।


1

আমার জন্য, এটি বেশ জটিল, বিশেষত লস্টফোকস বাঁধাইয়ের সাথে ব্যবহার করার সময়। যাইহোক, আমার কাজটি হ'ল একটি খালি লেবেল যুক্ত করা এবং এটিতে ফোকাস করা।

<Label Name="ResetFocusArea" Focusable="True" FocusVisualStyle="{x:Null}" />

...

OnKeyDown(object sender, RoutedEventArgs e)
{
  //if is Esc
  ResetFocusArea.Focus();
}

0

আমার উত্তর উপরের প্রশ্নটি সরাসরি সমাধান করে না, তবে আমি অনুভব করি যে এটির শব্দাবলীর কারণে প্রোগ্রামিকভাবে ফোকাস থেকে মুক্তি পাওয়ার বিষয়ে "প্রশ্ন" হয়ে গেছে। একটি সাধারণ দৃশ্যের যেখানে এটির প্রয়োজন এটি হ'ল উইন্ডোর মতো কোনও রুট কন্ট্রোলের পটভূমিতে বাম-ক্লিকের উপর ফোকাস সাফ করতে সক্ষম হওয়া।

সুতরাং, এটি অর্জন করতে, আপনি একটি সংযুক্ত আচরণ তৈরি করতে পারেন যা গতিশীলভাবে তৈরি নিয়ন্ত্রণের দিকে ফোকাস পরিবর্তন করবে (আমার ক্ষেত্রে, একটি খালি লেবেল)। উইন্ডোজের মতো সর্বোচ্চ স্তরের উপাদানগুলিতে এই আচরণটি ব্যবহার করা পছন্দনীয়, কারণ এটি শিশুদের মাধ্যমে একটি প্যানেল আবিষ্কার করে যাতে এটি একটি ডামি লেবেল যুক্ত করতে পারে rates

public class LoseFocusOnLeftClick : Behavior<FrameworkElement>
{
    private readonly MouseBinding _leftClick;
    private readonly Label _emptyControl = new Label() { Focusable = true, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top };

    public LoseFocusOnLeftClick()
    {
        _leftClick = new MouseBinding(new RelayCommand(LoseFocus), new MouseGesture(MouseAction.LeftClick));
    }

    protected override void OnAttached()
    {
        AssociatedObject.InputBindings.Add(_leftClick);
        AssociatedObject.Loaded += AssociatedObject_Loaded;
    }        

    protected override void OnDetaching()
    {
        AssociatedObject.InputBindings.Remove(_leftClick);
        AssociatedObject.Loaded -= AssociatedObject_Loaded;
    }

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        AssociatedObject.Loaded -= AssociatedObject_Loaded;

        AttachEmptyControl();
    }

    private void AttachEmptyControl()
    {            
        DependencyObject currentElement = AssociatedObject;
        while (!(currentElement is Panel))
        {
            currentElement = VisualTreeHelper.GetChild(currentElement, 0);
        }

        ((Panel)currentElement).Children.Add(_emptyControl);
    }

    private void LoseFocus()
    {            
        _emptyControl.Focus();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.