2011-01-03 13 views
5

मैं वर्तमान में WPF का उपयोग कर सी # में एक एप्लिकेशन विकसित कर रहा हूं। मुझे क्या करने में सक्षम होने की आवश्यकता है लेबल पर यह लेबल के पाठ के बाईं ओर एक छवि है जो एक्स की एक छोटी छवि या परिस्थितियों के आधार पर टिक की एक छोटी छवि है। मुझे परियोजनाओं में छवियों नामक फ़ोल्डर में शामिल छवियां मिली हैं।wpf में किसी लेबल में एक छवि जोड़ना?

कोड में प्रोग्रामेटिक रूप से लेबल के बाईं ओर स्थित छवियों को कैसे आवंटित किया जा सकता है और XAML कोड का उपयोग नहीं कर सकता।

उत्तर

2

जब से तुम XAML भीतर के पीछे और नहीं कोड में यह चाहते हैं मैं Label खुदाई और नीचे के रूप में जहां MyGrid किसी भी कंटेनर हो सकता है देखा एक StackPanel एक Image और TextBlock के साथ मिलकर उपयोग करने का सुझाव होगा ...

 <Grid Name="MyGrid"/> 

... फिर आपके कोड में ...

 StackPanel myStackPanel = new StackPanel(); 
     myStackPanel.Orientation = Orientation.Horizontal; 

     Image myImage = new Image(); 
     BitmapImage myImageSource = new BitmapImage(); 
     myImageSource.BeginInit(); 
     myImageSource.UriSource = new Uri("Images/MyImage.png"); 
     myImageSource.EndInit(); 
     myImage.Source = myImageSource; 

     TextBlock myTextBlock = new TextBlock(); 
     myTextBlock.Text = "This is my image"; 

     myStackPanel.Children.Add(myImage); 
     myStackPanel.Children.Add(myTextBlock); 

     MyGrid.Children.Add(myStackPanel); 
+0

ग्रीट उत्तर !! – CharlieShi

4

आप या तो समूह यह एक ग्रिड के अंदर:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Image Grid.Column="0" Source="{Binding ImageSourceProperty}" /> 
    <Label Grid.Column="1" Content="{Binding LabelTextProperty}" /> 
</Grid> 

या, के बाद से लेबल एक सामग्री नियंत्रण है, तो आप बस एक लेबल नियंत्रण के अंदर छवि नियंत्रण रख सकते हैं:

<Label> 
    <Image Source="{Binding ImageSourceProperty}" /> 
    My Text 
</Label> 

एक बार आप जानते हैं कि xaml कैसा दिखना चाहिए, कोड के माध्यम से समान तत्व बनाना बहुत आसान है।

+2

आपका दूसरा उदाहरण काम नहीं करता है। ContentControl में केवल एक बच्चा हो सकता है, और आप इसे दो (छवि और टेक्स्ट) दे रहे हैं। आपको उनके चारों ओर एक स्टैकपैनल लपेटना होगा, उदा। '' –

+0

आप सही हैं, जब मैंने इसे लिखा था तो सीधे सोचना नहीं चाहिए। –

+0

@ जो: आपका कोड या तो काम नहीं करता है - 'स्ट्रिंग' प्रकार का एक संग्रह किसी संग्रह या शब्द 'UIElementCollection' – Casebash

1

मैं यहां दो अन्य उत्तरों से सहमत नहीं हूं। सामग्री को लपेटने के लिए ग्रिड को जोड़ने की आवश्यकता नहीं है। Stackpanel पर्याप्त है।

xaml में एक स्टैकपैन जोड़ें जहां आपको सामग्री की आवश्यकता है।

<StackPanel Name="myStack" Orientation="Horizontal"></StackPanel> 

तो कोड के पीछे में, एक बटन हैंडलर में या जब की तरह विंडो लोड जोड़ने के इस

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

myStack.Children.Add(coolPic); // adding the pic first places it on the left 
myStack.Children.Add(text); // the text would show up to the right 

आप पहली बार तब पाठ जोड़कर छवि के स्थान और पाठ स्वैप कर सकते हैं छवि।

यदि आप छवि को नहीं देखते हैं कि छवि की निर्माण कार्य छवि की गुण विंडो में संसाधन पर सेट है।

कोड को और अधिक उपयोगी और अधिक गतिशील होने के लिए आपको टेक्स्ट या छवि को बदलने का एक तरीका चाहिए।

तो मान लीजिए कि आपने उन बदलने के लिए करना चाहता था और आप आगे बढ़ कर एक

((TextBlock)FindName("myText")).Text = "my other cool pic"; 

आप उम्मीद करेंगे पाठ परिवर्तित करने की है, लेकिन क्या होता है?

Object reference not set to an instance of an object. 

ड्रैट्स लेकिन मैंने इसे एक नाम दिया। आपको

// register the new control 
RegisterName(text.Name, text); 

जोड़ने की आवश्यकता होगी ताकि आप बाद में टेक्स्टब्लॉक तक पहुंच सकें। इसकी आवश्यकता है क्योंकि आपने इसे बनाया और प्रदर्शित करने के बाद ढांचे पर नियंत्रण जोड़ा।इसलिए अंतिम कोड छवि को पंजीकृत करने के बाद भी ऐसा लगता है

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

// register the new control 
RegisterName(coolPic.Name, coolPic); 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

// register the new control 
RegisterName(text.Name, text); 

myStack.Children.Add(coolPic); 
myStack.Children.Add(text); 
संबंधित मुद्दे