2012-04-17 25 views
6

जब आपके पास wpf में usercontrol है तो क्या यह इसके मूल तत्वों के बाहर पहुंच सकता है? उदाहरण के लिए, मेरे उपयोगकर्ता नियंत्रण में कुछ सामान्य चीजें सूचीबद्ध होती हैं जो नियंत्रण के अंदर रखी जाती हैं जो मुख्य विंडो पर डॉकपैनल के भीतर encapsulated है, लेकिन मेरे पास मुख्य विंडो में एक टेक्स्टबॉक्स और बटन है जिसे मैं नियंत्रण से एक्सेस करना चाहता हूं ... क्या यह संभव है?wpf में मूल तत्वों का उपयोग कर UserControl?

यह पूरी विंडो की सामग्री को बदलने और प्रत्येक उपयोगकर्ता नियंत्रण में एक ही टेक्स्टबॉक्स/बटन प्रदर्शित करने के बजाय मुझे बहुत समय बचाएगा। अगर किसी के पास इसका उदाहरण है तो इसकी बहुत सराहना की जाएगी।

+0

इस पर फिर से विचार लिया - आप DataBinding के साथ माता-पिता तत्वों और पूर्वज का एक RelativeSource तक पहुँचने की कोशिश की? यहां एक अच्छा [SO उत्तर] है (http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource) यदि ऐसा है तो। यदि यह एक अच्छा समाधान की तरह प्रतीत नहीं होता है तो आप समस्या को स्पष्ट करने के लिए कुछ कोड पोस्ट करना चाह सकते हैं। चीयर्स – Berryl

उत्तर

3

हां यह संभव है और यहां कुछ कोड है जिसका उपयोग मैंने यूजरकंट्रोल से प्रस्तुतियों को लिखने के लिए किया है, जिनमें डीपी हैं।

मुझे इसे थोड़ा प्यार नहीं है, लेकिन यह काम करता है। मुझे यह भी लगता है कि यह महान विषय है और शायद कुछ कोड कुछ बेहतर उत्तरों को पाने में मदद करेंगे!

चीयर्स,
बेरी

UserControl XAML

<Button x:Name="btnAddNewItem" Style="{StaticResource blueButtonStyle}" > 
    <StackPanel Orientation="Horizontal"> 
     <Image Source="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=bullet_add}" Stretch="Uniform" /> 
     <Label x:Name="tbItemName" Margin="5" Foreground="White" Padding="10, 0">_Add New [item]</Label> 
    </StackPanel> 
</Button> 

UserControl

public partial class AddNewItemButton : UserControl 
{ 
    ... 

    #region Item Name 

    public static readonly DependencyProperty ItemNameProperty = DependencyProperty.Register(
     "ItemName", typeof(string), typeof(AddNewItemButton), 
     new FrameworkPropertyMetadata(OnItemNameChanged)); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 

    public string ButtonText { get { return (string) tbItemName.Content; } } 

    private static void OnItemNameChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     // When the item name changes, set the text of the item name 
     var control = (AddNewItemButton)obj; 

     control.tbItemName.Content = string.Format(GlobalCommandStrings.Subject_Add, control.ItemName.Capitalize()); 
     control.ToolTip = string.Format(GlobalCommandStrings.Subject_Add_ToolTip, control.ItemName); 
    } 

    #endregion 

    #region Command 

    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
     "Command", typeof(ICommand), typeof(AddNewItemButton), 
     new FrameworkPropertyMetadata(OnCommandChanged)); 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    private static void OnCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     // When the item name changes, set the text of the item name 
     var control = (AddNewItemButton)obj; 
     control.btnAddNewItem.Command = control.Command; 
    } 

    #endregion 

} 
पीछे कोड

enter image description here

एक और UserControl दिखा संगठन

<UserControl ... 
     xmlns:uc="clr-namespace:Smack.Core.Presentation.Wpf.Controls.UserControls" 
     > 

    <DockPanel LastChildFill="True"> 
     ... 
     <uc:AddNewItemButton x:Name="_addNewItemButton" Margin="0,0,10 0" DockPanel.Dock="Right" /> 
     ... 
    </DockPanel> 
</UserControl> 

enter image description here

+1

सरल सवाल, डब्ल्यूटीएफ उत्तर। जवाब पर –

+1

@ बेरील +10! महान प्रयास और धन्यवाद! –

+1

@ केंडलफ्रे। यह * सरल नहीं है जब आप इसके बारे में सोचते हैं, लेकिन यदि यह आपके लिए है तो बस अपना मामला बनाने के लिए कुछ सरल और स्पष्ट कोड पोस्ट करें। – Berryl

3

एक बेहतर डिज़ाइन पैटर्न उपयोगकर्ता नियंत्रण को सूचित करने के लिए होता है जब ईवेंट को बदलने की आवश्यकता होती है, और विंडो को (विधि के माध्यम से) पूछने के लिए कुछ जानकारी की आवश्यकता होती है। उदाहरण के लिए, उदाहरण के लिए, उस विंडो पर GetText() विधि होगी जिसे उपयोगकर्ता नियंत्रण कॉल कर सकता है, और उस उपयोगकर्ता नियंत्रण पर चेंजटेक्स्ट ईवेंट जो विंडो सब्सक्राइब करेगा।

विचार यह है कि खिड़की को हर समय नियंत्रण में रखना है। इस मानसिकता का उपयोग करने से भविष्य में एप्लिकेशन विकसित करना आपके लिए आसान हो जाएगा।

+0

तो आपके उदाहरण का उपयोग करते हुए यदि आपके पास टेक्स्टबॉक्स और बटन था, तो आप उपयोगकर्ता नियंत्रण में टेक्स्ट कैसे भेजेंगे और फिर बटन पर टेक्स्ट के साथ उस नियंत्रण को पॉप्युलेट करेंगे? –

+0

उपयोगकर्ता नियंत्रण पर एक विधि बनाएं (कहें, 'SetText (स्ट्रिंग टेक्स्ट) ')। 'बटन 1_Click' में,' myUserControl.SetText (myTextBox.Text) 'पर कॉल करें।उपयोगकर्ता नियंत्रण में 'SetText' विधि में, आप जो भी आप उपयोगकर्ता नियंत्रण में डेटा को पॉप्युलेट करना चाहते हैं, कर सकते हैं। –

2

अपने प्रश्न का उत्तर देने के लिए: हाँ, आप या तो रिलेटिवसोर्स बाध्यकारी या बैक कोड में अभिभावक सदस्य के माध्यम से माता-पिता नियंत्रणों तक पहुंच सकते हैं। लेकिन एक बेहतर जवाब @ केंडलफ्रे उत्तर के समान है। Light MVVM जैसे ढांचे को अपनाने और इसके मैसेंजर क्लास का उपयोग करें या केंडल द्वारा वर्णित घटनाओं का उपयोग करें।

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