2011-11-12 13 views
17

मैंने ऑनलाइन शोध किया है लेकिन मुझे इसके बारे में कोई समाधान नहीं मिला है या इसके बारे में अस्पष्ट नहीं है।डब्ल्यूपीएफ सी # इनपुटबॉक्स

मैं सी # का उपयोग कर एक डब्ल्यूपीएफ आवेदन कर रहा हूं। मैं उपयोगकर्ता को अपना नाम दर्ज करने के लिए संकेत देने के लिए एक संवाद बॉक्स पॉप आउट करना चाहता हूं। इसके बाद मैं नाम का उपयोग करके नाम का ट्रैक रखूंगा और कुछ डेटा को txt फ़ाइल में सहेज दूंगा।

उदाहरण के लिए,

नाम इनपुट नाम = "जॉन"

और इसलिए मैं एक डेटा डेटा है = "1, 2, 3" है;

और फिर मैं जॉन.txt फ़ाइल में "डेटा" को सहेजता हूं।

कोई भी जानता है कि यह कैसे करें? मुझे लगता है कि समस्या यह है कि उपयोगकर्ता को नाम दर्ज करने के लिए एक संवाद कैसे पॉप आउट करना है।

धन्यवाद!

+0

http://social.msdn.microsoft.com/Forums/en/winforms/thread/191ddf61-3ae5-4845-b852-56bb9b77238a पर एक नज़र डालें। – mjwills

उत्तर

30

मैं उन संवादों का उपयोग करके एक दृष्टिकोण लेना पसंद करता हूं जो एप्लिकेशन को लॉक नहीं करता है, और अधिक पारंपरिक Win32 संवाद से दूर चला जाता है।

उदाहरण

Input Dialog

इनपुट संवाद हिडन

Input Dialog not showing.

इस उदाहरण में मैं MVVM आधारित समाधान मैं अपने अनुप्रयोगों के लिए उपयोग कर रहा हूँ का एक सरलीकृत संस्करण का उपयोग करें। यह सुंदर नहीं हो सकता है, लेकिन इसके पीछे मूल बातें पर आपको ठोस विचार देना चाहिए।

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <StackPanel> 
     <Button Content="Cool Button" x:Name="CoolButton" Click="CoolButton_Click"/> 
     <ListBox x:Name="MyListBox"/> 
    </StackPanel> 

    <!-- It's important that this is in the end of the XAML as it needs to be on top of everything else! --> 
    <Grid x:Name="InputBox" Visibility="Collapsed"> 
     <Grid Background="Black" Opacity="0.5"/> 
     <Border 
      MinWidth="250" 
      Background="Orange" 
      BorderBrush="Black" 
      BorderThickness="1" 
      CornerRadius="0,55,0,55" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center"> 
      <StackPanel> 
       <TextBlock Margin="5" Text="Input Box:" FontWeight="Bold" FontFamily="Cambria" /> 
       <TextBox MinWidth="150" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="InputTextBox"/> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
        <Button x:Name="YesButton" Margin="5" Content="Yes" Background="{x:Null}" Click="YesButton_Click"/> 
        <Button x:Name="NoButton" Margin="5" Content="No" Background="{x:Null}" Click="NoButton_Click" /> 
       </StackPanel> 
      </StackPanel> 
     </Border> 
    </Grid> 
</Grid> 

यह इस संवाद को दिखाने के लिए के रूप में आप ही दिखाई करने के लिए InputBox ग्रिड की दृश्यता निर्धारित करने की आवश्यकता बहुत आसान है। फिर आप बस हां/नहीं बटन को संभालते हैं और टेक्स्टबॉक्स से इनपुट टेक्स्ट प्राप्त करते हैं।

तो ShowDialog() की आवश्यकता वाले कोड का उपयोग करने के बजाय, आप बस Visibility विकल्प Visible पर सेट करें। इस उदाहरण में अभी भी कुछ चीजें हैं जो हम कोड-बैक में संभाल लेंगे, उदाहरण के लिए हाँ/नहीं बटन क्लिक को संभालने के बाद इनपुट टेक्स्ट बॉक्स को साफ़ करना।

कोड-पीछे:

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void CoolButton_Click(object sender, RoutedEventArgs e) 
     { 
      // CoolButton Clicked! Let's show our InputBox. 
      InputBox.Visibility = System.Windows.Visibility.Visible; 
     } 

     private void YesButton_Click(object sender, RoutedEventArgs e) 
     { 
      // YesButton Clicked! Let's hide our InputBox and handle the input text. 
      InputBox.Visibility = System.Windows.Visibility.Collapsed; 

      // Do something with the Input 
      String input = InputTextBox.Text; 
      MyListBox.Items.Add(input); // Add Input to our ListBox. 

      // Clear InputBox. 
      InputTextBox.Text = String.Empty; 
     } 

     private void NoButton_Click(object sender, RoutedEventArgs e) 
     { 
      // NoButton Clicked! Let's hide our InputBox. 
      InputBox.Visibility = System.Windows.Visibility.Collapsed; 

      // Clear InputBox. 
      InputTextBox.Text = String.Empty; 
     } 
    } 
} 

कोड-पीछे आसानी से एक निर्भरता का उपयोग कर इस मामले में किया जा सकता है, या ViewModel तर्क के रूप में है, लेकिन सादगी के लिए मैं इसे में कोड-पीछे रखा।

+1

यूप मुझे विचार मिला। धन्यवाद! – user981924

+0

जब आप दिखाए जाते हैं तो फोकस खोने से 'इनपुटबॉक्स' नियंत्रण को कैसे रोकें? – Marc

+0

@Marc मैंने अपने संवाद के लिए ContentControl तत्व के आधार पर एक कस्टम नियंत्रण बनाया है, और अंदर मैं ऑनविज़िबल चेंज ओवरराइड करता हूं, और यदि संवाद दिखाई देता है तो मैंने 'कीबोर्ड' फोकस (टेक्स्टबॉक्स) सेट किया है। – eandersson

4

बस अपने विजुअल स्टूडियो-प्रोजेक्ट में एक और विंडो क्लास बनाएं, जिसमें सार्वजनिक संपत्ति में उपयोगकर्ता नाम है। फिर अपनी मुख्य विंडो में कहीं भी इस विंडो का एक उदाहरण बनाएं, और ShowDialog विधि का उपयोग करके इसे दिखाएं। यह तब तक ब्लॉक करता है जब तक आपकी "संवाद" विंडो बंद न हो जाए। फिर आप सार्वजनिक संपत्ति से उपयोगकर्ता नाम प्राप्त कर सकते हैं और जो कुछ भी आप चाहते हैं उसे कर सकते हैं।

3

उपयोगकर्ता से इनपुट लेने के लिए अपनी परियोजना में नया Window बनाएं/जोड़ें। इसके बाद आप Window.Show या Window.ShowDialog का उपयोग एक पॉप अप विंडो के रूप में उस खिड़की को दिखाने के लिए कर सकते हैं

इसके अलावा एक OK बटन n बनाई गई खिड़की और ओके बटन पर क्लिक करें जोड़ने पाठ फ़ाइल पर कस्टम संवाद बक्से पर

1

धारा में जानकारी को सहेजने एमएसडीएन आपको कुछ मार्गदर्शन दे सकता है: Custom Dialog Box in WPF। कोड नमूना और एक्सएएमएल स्रोत भी है।

एक बार जब आप इससे निपटते हैं, तो आप डेटा को फ़ाइल में सहेजने के तरीके को खोज सकते हैं - यह काफी आसान है, और ऐसा करने के कई तरीके हैं (जिनमें से एक TextWriter कक्षा का उपयोग कर रहा है: example)।

4

मेरा समाधान यहां है, मैंने इसे टाइप करने में लगभग 3 घंटे लग गए। यह पूरी तरह से अनुकूलन योग्य है।

स्ट्रिंग var = नया इनपुटबॉक्स ("टेक्स्ट");

और इस वर्ग के

 public class InputBox 
     { 

      Window Box = new Window();//window for the inputbox 
      FontFamily font = new FontFamily("Tahoma");//font for the whole inputbox 
      int FontSize=30;//fontsize for the input 
      StackPanel sp1=new StackPanel();// items container 
      string title = "InputBox";//title as heading 
      string boxcontent;//title 
      string defaulttext = "Scrivi quì il tuo nome...";//default textbox content 
      string errormessage = "Scelta non valida";//error messagebox content 
      string errortitle="Errore";//error messagebox heading title 
      string okbuttontext = "OK";//Ok button content 
      Brush BoxBackgroundColor = Brushes.GreenYellow;// Window Background 
      Brush InputBackgroundColor = Brushes.Ivory;// Textbox Background 
      bool clicked = false; 
      TextBox input = new TextBox(); 
      Button ok = new Button(); 
      bool inputreset = false; 
      public InputBox(string content) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       windowdef(); 
      } 
      public InputBox(string content,string Htitle, string DefaultText) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       try 
       { 
        title = Htitle; 
       } 
       catch 
       { 
        title = "Error!"; 
       } 
       try 
       { 
        defaulttext = DefaultText; 
       } 
       catch 
       { 
        DefaultText = "Error!"; 
       } 
       windowdef(); 
      } 
      public InputBox(string content, string Htitle,string Font,int Fontsize) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       try 
       { 
        font = new FontFamily(Font); 
       } 
       catch { font = new FontFamily("Tahoma"); } 
       try 
       { 
        title = Htitle; 
       } 
       catch 
       { 
        title = "Error!"; 
       } 
       if (Fontsize >= 1) 
        FontSize = Fontsize; 
       windowdef(); 
      } 
      private void windowdef()// window building - check only for window size 
      { 
       Box.Height = 500;// Box Height 
       Box.Width = 300;// Box Width 
       Box.Background = BoxBackgroundColor; 
       Box.Title = title; 
       Box.Content = sp1; 
       Box.Closing += Box_Closing; 
       TextBlock content=new TextBlock(); 
       content.TextWrapping = TextWrapping.Wrap; 
       content.Background = null; 
       content.HorizontalAlignment = HorizontalAlignment.Center; 
       content.Text = boxcontent; 
       content.FontFamily = font; 
       content.FontSize = FontSize; 
       sp1.Children.Add(content); 

       input.Background = InputBackgroundColor; 
       input.FontFamily = font; 
       input.FontSize = FontSize; 
       input.HorizontalAlignment = HorizontalAlignment.Center; 
       input.Text = defaulttext; 
       input.MinWidth = 200; 
       input.MouseEnter += input_MouseDown; 
       sp1.Children.Add(input); 
       ok.Width=70; 
       ok.Height=30; 
       ok.Click += ok_Click; 
       ok.Content = okbuttontext; 
       ok.HorizontalAlignment = HorizontalAlignment.Center; 
       sp1.Children.Add(ok); 

      } 
      void Box_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
      { 
       if(!clicked) 
       e.Cancel = true; 
      } 
      private void input_MouseDown(object sender, MouseEventArgs e) 
      { 
       if ((sender as TextBox).Text == defaulttext && inputreset==false) 
       { 
        (sender as TextBox).Text = null; 
        inputreset = true; 
       } 
      } 
      void ok_Click(object sender, RoutedEventArgs e) 
      { 
       clicked = true; 
       if (input.Text == defaulttext||input.Text == "") 
        MessageBox.Show(errormessage,errortitle); 
       else 
       { 
        Box.Close(); 
       } 
       clicked = false; 
      } 
      public string ShowDialog() 
      { 
       Box.ShowDialog(); 
       return input.Text; 
      } 


     } 

आशा है कि यह उपयोगी हो सकता है के कोड है।

संबंधित मुद्दे