WPF

2008-11-06 13 views
29

में उपयोगकर्ता नियंत्रण से प्रवेश करना मैं WPF के लिए बिल्कुल नया हूं और मुझे उपयोगकर्ता नियंत्रण से विरासत में समस्या है।WPF

मैंने एक उपयोगकर्ता नियंत्रण बनाया और अब मुझे उस नियंत्रण से प्राप्त करने की आवश्यकता है और कुछ और कार्यक्षमता जोड़ें।

क्या कोई इस तरह की चीज पहले करता है? किसी भी तरह की सहायता का स्वागत किया जाएगा।

आप

+2

विजुअल विरासत के साथ डब्ल्यूपीएफ वर्कअराउंड के लिए देखें: http://svetoslavsavov.blogspot.gr/2009/09/user-control-inheritance-in-wpf.html या पूर्वजों में स्पष्ट रूप से जीयूआई को परिभाषित करने के लिए http: // देखें support.microsoft.com/kb/957231 –

उत्तर

14

AFAIK आप xaml का उत्तराधिकारी नहीं हो सकते हैं, आप केवल कोड को पीछे ही प्राप्त कर सकते हैं।

हमें हाल ही में हमारी परियोजना पर एक ही समस्या का सामना करना पड़ा। जिस तरह से हमने अपनी समस्या को हल करने का अंत किया, वह उपयोगकर्ता नियंत्रण बनाना और इसे "बच्चे" उपयोगकर्ता नियंत्रण में जोड़ना था।

तो वह does not काम/मदद इस पर एक नज़र डालें: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx1

26

खैर .. आप अपने आधार नियंत्रण

public abstract class BaseUserControl : UserControl{...} 

तो XAML फाइल में बनाने धन्यवाद:

<Controls:BaseUserControl x:Class="Termo.Win.Controls.ChildControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Controls="clr-namespace:Namespace.Of.Your.BaseControl"> 

और वह काम करना चाहिए।

संपादित करें: हम्म .. यह उदाहरण तब उपयोगी होता है जब आपके पास एक्सएएमएल के बिना आधार नियंत्रण होता है और फिर उससे प्राप्त होता है। दूसरी तरफ (Xaml के साथ आधार नियंत्रण से) - मुझे यकीन नहीं है कि आप इसके बारे में कैसे जा सकते हैं।

EDIT2: स्पष्ट रूप से this post + comments से मैं यह लेता हूं कि आप जो चाहते हैं वह संभव नहीं हो सकता है।

+1

यह समाधान मेरे लिए काम करता है। – GeekyMonkey

+2

जहां तक ​​मुझे याद है, डिजाइनर शिकायत करता है जब आप एक्सएएमएल में एक अमूर्त वर्ग का उत्तराधिकारी बनने का प्रयास करते हैं। अन्यथा यह ठीक काम करना चाहिए। – Entrodus

+0

यह भी मेरे लिए काम किया। धन्यवाद! –

4

मैं एक समाधान का एक सा हो सकता है: विरासत के बजाय रचना - मैं नियंत्रण, है कि 'सामग्री स्लॉट' के साथ आए हैं डाटाबेसिंग के माध्यम से बाहर से असाइन करने योग्य, मेरे SO thread देखें। उपयोग की

उदाहरण:

<UserControl ... > 

    <!-- My wrapping XAML --> 
     <Common:DialogControl> 
       <Common:DialogControl.Heading> 
         <!-- Slot for a string --> 
       </Common:DialogControl.Heading> 
       <Common:DialogControl.Control> 
         <!-- Concrete dialog's content goes here --> 
       </Common:DialogControl.Control> 
       <Common:DialogControl.Buttons> 
         <!-- Concrete dialog's buttons go here --> 
       </Common:DialogControl.Buttons> 
     </Common:DialogControl> 
    <!-- /My wrapping XAML --> 

</UserControl> 

साथ में codebehind में कुछ हैंडलिंग कोड के साथ संवाद खिड़कियों के लिए एक अच्छी आधार घटक होगा।

2

आप delegate का उपयोग करके इसे पूरा कर सकते हैं।

अनिवार्य रूप से, आपको एक इंटरफ़ेस (YourInterface) बनाने की आवश्यकता है जो आपके इच्छित कार्यक्षमता को लपेटता है, फिर उपयोगकर्ता नियंत्रण और आपकी कक्षा दोनों इंटरफ़ेस को कार्यान्वित करें।

अगला, सुनिश्चित करें कि उपयोगकर्ता नियंत्रण IYourInterface के किसी ऑब्जेक्ट का संदर्भ है, ताकि जब आपका उपयोगकर्ता नियंत्रण Interface की विधि का आह्वान करने का प्रयास करता है, तो यह आपकी कक्षा की विधि को कॉल करता है।

क्योंकि उपयोगकर्ता नियंत्रण और कक्षा दोनों एक ही इंटरफ़ेस को लागू करते हैं, इसलिए उन्हें एक ही प्रकार की वस्तु के रूप में देखा जा सकता है - जिसका अर्थ है कि आप उन्हें IYourInterface प्रकार के ऑब्जेक्ट्स के संग्रह में डाल सकते हैं। यह आपको वह व्यवहार देना चाहिए जो आप चाहते हैं।

एएसपी में।नेट मैं अपने तकनीक को abstract class पूर्वजों से प्राप्त करता हूं, अक्सर इस तकनीक का उपयोग करता हूं। मुझे समझ में नहीं आता क्यों डब्ल्यूपीएफ इसका समर्थन नहीं करता है। :(

1

आप XAML कोड यह आत्म वारिस नहीं कर सकते लेकिन codebehind का एक अमूर्त वर्ग बनाते समय, आप कोड में पीछे संपादित करने के लिए, एक व्युत्पन्न वर्ग वस्तु से की अनुमति देगा

Xaml कोड:।। {Window1.xaml }

<Window 
x:Class="WPFSamples.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="auto" Width="256" Title="WPF Sameples"> 
    <Grid> 
    <Button x:Name="Button1" VerticalAlignment="Center" HorizontalAlignment="Center" Content="Click Me"/> 
    </Grid> 
</Window> 

codebehind: {} Window1.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

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

व्युत्पन्न वर्ग: {} DisabledButtonWindow.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace WPFSamples 
{ 
    public sealed class DisabledButtonWindow : Window1 
    { 
     public DisabledButtonWindow() 
     { 
      Button1.IsEnabled = false; 
     } 
    } 
} 

हालांकि आप स्वयं wpf स्रोत से प्राप्त नहीं कर सकते हैं, तो आप इस "विंडो 1" नियंत्रण को अन्य सभी व्युत्पन्न नियंत्रणों के लिए टेम्पलेट के रूप में उपयोग करने में सक्षम हैं।

1

मुझे लगता है कि आप ऐसा कर सकते हैं लेकिन आपको किसी भी कार्य को संभवतः फिर से परिभाषित करना होगा और संभवतः कुछ अन्य सामान जो आप बच्चे वर्ग में xaml में संदर्भित करते हैं।

आईई यदि आपके पास एक बटन क्लिक ईवेंट है जिसे आप बेस क्लास xaml में सब्सक्राइब करते हैं तो आपको बाल वर्ग में बटन क्लिक करने की आवश्यकता होगी और बेस क्लास बटन क्लिक ईवेंट पर कॉल करें।

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