फोकस को xaml wpf के टेक्स्टबॉक्स पर सेट करें


91

इस मंच पर कुछ पोस्ट और दूसरों के बावजूद मुझे कुछ ऐसा नहीं मिला जो बताता है कि फोकस कैसे सेट किया जाए TextBox

मेरे पास कई लेबल और टेक्स्ट बॉक्स के साथ एक उपयोगकर्ता नियंत्रक है। जब फॉर्म लोड हो जाता है तो मैं चाहता हूं कि एक विशेष टेक्स्टबॉक्स फोकस हो।

मैंने tabIndex सेट किया है, लेकिन यह काम नहीं कर रहा है।

कोई सुझाव?


जवाबों:


177

आप FocusManager.FocusedElementइस उद्देश्य के लिए संलग्न संपत्ति का उपयोग कर सकते हैं । यहां कोड का एक टुकड़ा है जो डिफ़ॉल्ट रूप से TxtB पर ध्यान केंद्रित करता है।

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

TxtB.Focus()यदि आप XAML में ऐसा नहीं करना चाहते हैं, तो आप अपने कोड-पीछे में भी उपयोग कर सकते हैं ।


13
@TarkaDaal: "यह मेरे लिए काम नहीं करता था" टिप्पणी थोड़ी अधिक विस्तृत हो सकती है। यह शायद ध्यान चुराने वाला एक और नियंत्रण है। जब WPF में फोकस युद्ध शुरू होता है, तो चीजें शरारती हो जाती हैं! कृपया अपने नियंत्रणों को सत्यापित करें, और जहां आप वर्तमान में दृश्य ट्री में हैं (उदाहरण के लिए, कॉम्बो बॉक्स टेम्पलेट के अंदर, इसका कोई प्रभाव नहीं होगा, और इस तरह के कई अन्य मामले हैं)। यदि आपको चोरी करने वाला नहीं मिलता है, तो लोड होने पर नियंत्रण पर ध्यान केंद्रित करने के लिए एक व्यवहार या कोड-पीछे का उपयोग करें।
जूलियन लेबोस्क्वैन

@JulienLebosquain: यह एक बहुत ही सरल नियंत्रण, दो बटन और एक ग्रिड के भीतर एक टेक्स्टबॉक्स था (जहां मैं FocusManagerसामान डाल रहा हूं )। अंत में, मैंने इसे कोड-पीछे में किया।
तारकादल

सदस्य "फोकस्डएलेमेंट" मान्यता प्राप्त नहीं है या सुलभ नहीं है। :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@ HendyIrawan क्या यह सिल्वरलाइट प्रोजेक्ट है, हो सकता है?
मोजोफिल्टर

@MojoFilter यह विंडोज फोन 8 डब्ल्यूपीएफ परियोजना है
हेंडी

28

आप इस संपत्ति को सीधे TextBox पर लागू कर सकते हैं:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>

16
मेरे लिए काम नहीं किया, FocusManager की स्थापना की। फ़ोकसएडरडाइटमेंट = "{बाइंडिंग एलिमेंटनाम = TxtB}" कंटेनर पर काम किया
ग्रांट

1
एक आकर्षण की तरह काम करता है और इसे किसी भी तरह की प्रार्थनाओं की आवश्यकता नहीं होती है।
साइमन मैट्स

1
मेरे लिए भी काम नहीं किया। क्या हम कुछ याद कर रहे हैं?
BrunoLM

1
मेरे लिए भी काम नहीं किया। जूलियन लेबोस्क्वैन के काम का सुझाव।
Crypt32

1
मेरे लिए भी काम नहीं करता है। प्रस्तावित अन्य सभी विधियां भी काम नहीं कर रही हैं। यह समस्या प्राथमिक होनी चाहिए और इसे आसानी से हल किया जाना चाहिए .. यही कारण है कि कई पीपीएल को wpf पसंद नहीं है।
इगोरस्टैक

6

मैं WPF का उपयोग करने के लिए नया हूं और उपरोक्त उदाहरणों के माध्यम से पढ़ रहा हूं, मेरे पास एक समान अनुभव था जो दिए गए xaml कोड उदाहरणों का उपयोग करके टेक्स्टबॉक्स पर ध्यान केंद्रित करने का प्रयास करता है, अर्थात ऊपर दिए गए सभी उदाहरणों ने काम नहीं किया।

मैंने जो पाया वह मुझे पेज तत्व में FocusManager.FocusElement को जगह देना था। मुझे लगता है कि यदि आप विंडो को मूल तत्व के रूप में उपयोग करते हैं तो यह संभवतः भी काम करेगा। वैसे भी, यहाँ कोड है कि मेरे लिए काम किया है।

 <Page x:Class="NameOfYourClass"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d"
  Title="Title" 
  Height="720"
  Width="915"
  Background="white"
  Loaded="pgLoaded"
  FocusManager.FocusedElement="{Binding ElementName=NameOfYourTextBox}">

  <!-- Create child elements here. -->

  </Page>

0

उस तत्व को बांधें जिसे आप फोकस करना चाहते हैं

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

ग्रिड या ग्रुपबॉक्स आदि में


4
उह हाँ, एक ही जवाब देने के लिए धन्यवाद बाकी सभी ने किया ... 4 साल बाद ...
एडम प्लोचर

4
@AdamPlocher एक अच्छा, आपने स्थायी रूप से स्टैक ओवरफ्लो से सल्फियन को हटा दिया। "स्टैक ओवरफ्लो में आपका स्वागत है" संदेश अधिक उपयुक्त होता।
कंटीनो

2
@ कांटांगो: "अंतिम बार देखा गया Nov 11 '14"। एडम लंबे समय तक अपनी टिप्पणी :)
गोन कोडिंग

0

फ़ोकसमैनर इंटेलीसेन्स में नहीं था और इसने मुझे थोड़ा भ्रमित किया। मैंने पूरी विशेषता टाइप की और यह काम कर गया।

FocusManager.FocusedElement = "{बाइंडिंग एलिमेंटनेम = MyTextBox}"


Microsoft Visual Studio Enterprise 2015 संस्करण 14.0.23107.0/C#/WPF


0

पूर्णता के लिए, कोड को पीछे से संभालने का एक तरीका भी है (जैसे नियंत्रण के मामले में, जो भी कारण से, गतिशील रूप से बनाए जाते हैं और एक्सएएमएल में मौजूद नहीं होते हैं)। हैंडलर को विंडो के लोड किए गए ईवेंट में संलग्न करें और फिर अपने नियंत्रण की ".Focus ()" विधि का उपयोग करें। नीचे नंगे-हड्डी उदाहरण।

public class MyWindow
{
    private VisualCollection controls;
    private TextBox textBox;

    // constructor
    public MyWindow()
    {
        controls = new VisualCollection(this);
        textBox = new TextBox();
        controls.Add(textBox);

        Loaded += window_Loaded;
    }

    private void window_Loaded(object sender, RoutedEventArgs e)
    {
        textBox.Focus();
    }
}

0

चारों ओर प्रयोग करने से, xaml समाधान

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

जब आप इसे खिड़की के पदानुक्रम में उच्चतम तत्व में रखते हैं तो यह सबसे अच्छा काम करता है (आमतौर पर विंडो, या ग्रिड जिसे आप कहीं और रखते हैं)


0

उपयोग: local:FocusManager.FocusOnLoad="True"

    public class FocusManager
    {
        public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached(
            "FocusOnLoad",
            typeof(bool),
            typeof(FocusManager),
            new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged))
            );

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (!(sender is Control control))
                return;

            if ((bool) e.NewValue == false)
                return;

            control.Loaded += (s, e) => control.Focus();
        }

        public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad);

        public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value);
    }

0

मैं एक DataTemplate के अंदर एक ग्रिड के अंदर एक TextBox है जो मैं कीबोर्ड फोकस होना चाहता हूं जब यह दिखाई देता है। मैंने वो भी पाया

<DataTemplate x:Key="DistanceView" DataType="{x:Type vm:ROI}">
    <Grid FocusManager.FocusedElement="{Binding ElementName=tbDistance}">
        <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/>
    </Grid>
</DataTemplate>

मेरे लिए काम नहीं किया।

हालाँकि जब मैं मूल ContentControl में फोकस () कहता हूं

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

यह काम करना शुरू कर देता है और टेक्स्टबॉक्स में कैरेट दिखाई देता है। मुझे लगता है कि फ़ोकसकैप को फ़ोकसमैनगर के लिए फोकस दिया जाना चाहिए। फ़ोकस की गई संपत्ति का कोई प्रभाव नहीं होना चाहिए।

जैरी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.