WPF UserControl एक WPF UserControl कैसे वारिस कर सकता है?


92

निम्नलिखित WPF UserControl ने DataTypeWholeNumber कहा है जो काम करता है।

अब मैं एक UserControl DataTypeDateTime और DataTypeEmail , आदि नाम बनाना चाहता हूं ।

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

हालाँकि, जब मैं ऐसा करता हूं, मुझे त्रुटि मिलती है : आंशिक घोषणा में भिन्न आधार वर्ग नहीं हो सकते हैं

तो मैं कैसे कर सकते हैं विरासत साझा के साथ UserControls तो साझा कार्यक्षमता सभी आधार वर्ग में है?

using System.Windows;
using System.Windows.Controls;

namespace TestDependencyProperty827.DataTypes
{
    public partial class DataTypeWholeNumber : BaseDataType
    {
        public DataTypeWholeNumber()
        {
            InitializeComponent();
            DataContext = this;

            //defaults
            TheWidth = 200;
        }

        public string TheLabel
        {
            get
            {
                return (string)GetValue(TheLabelProperty);
            }
            set
            {
                SetValue(TheLabelProperty, value);
            }
        }

        public static readonly DependencyProperty TheLabelProperty =
            DependencyProperty.Register("TheLabel", typeof(string), typeof(BaseDataType),
            new FrameworkPropertyMetadata());


        public string TheContent
        {
            get
            {
                return (string)GetValue(TheContentProperty);
            }
            set
            {
                SetValue(TheContentProperty, value);
            }
        }

        public static readonly DependencyProperty TheContentProperty =
            DependencyProperty.Register("TheContent", typeof(string), typeof(BaseDataType),
            new FrameworkPropertyMetadata());


        public int TheWidth
        {
            get
            {
                return (int)GetValue(TheWidthProperty);
            }
            set
            {
                SetValue(TheWidthProperty, value);
            }
        }

        public static readonly DependencyProperty TheWidthProperty =
            DependencyProperty.Register("TheWidth", typeof(int), typeof(DataTypeWholeNumber),
            new FrameworkPropertyMetadata());



    }
}

WPF के लिए दृश्य विरासत देखने के साथ वैकल्पिक हल: svetoslavsavov.blogspot.gr/2009/09/... या स्पष्ट रूप से पूर्वज देखने में जीयूआई परिभाषित करने के लिए support.microsoft.com/kb/957231
जॉर्ज Birbilis

जवाबों:


130

सुनिश्चित करें कि आपने xaml में पहला टैग भी बदल दिया है, जो कि आपके नए आधार से विरासत में मिला है

इसलिए

<UserControl x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    >

हो जाता है

<myTypes:BaseDataType x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:myTypes="clr-namespace:TestDependencyProperty827.DataTypes"
    >

तो, नीचे दिए गए टिप्पणियों से अतिरिक्त विवरण सहित पूर्ण उत्तर को संक्षेप में प्रस्तुत करें:

  • बेस क्लास में xaml फ़ाइल शामिल नहीं होनी चाहिए। इसे एक एकल (गैर-आंशिक) सीएस फ़ाइल में परिभाषित करें और इसे सीधे Usercontrol से इनहेरिट करने के लिए परिभाषित करें।
  • सुनिश्चित करें कि उपवर्ग आधार वर्ग से दोनों सीएस कोड पीछे फाइल में और xaml के पहले टैग में (जैसा कि ऊपर दिखाया गया है) विरासत में मिला है।

4
जब मैं वह परिवर्तन करता हूं तो मुझे त्रुटि मिलती है: "... DataTypes.BaseDataType XAML फ़ाइल की जड़ नहीं हो सकती क्योंकि इसे XAML का उपयोग करके परिभाषित किया गया था", आप इस परिपत्र संदर्भ से कैसे बाहर निकलेंगे?
एडवर्ड टंगुय

9
यदि आप बस बेस क्लास को एक सामान्य प्रकार बना सकते हैं जो किसी भी एक्सएमएल को परिभाषित किए बिना UserControl से विरासत में मिला है (इसलिए दो फ़ाइलों पर एक आंशिक वर्ग विभाजन नहीं)। समस्या यह है कि आपको xmal विरासत में नहीं मिल सकता है, इसलिए या तो बेस या चाइल्ड क्लास के पास xmal फ़ाइल नहीं होना चाहिए। या तो उपयोगकर्ता नियंत्रण के बजाय अपनी कक्षाओं को कस्टम नियंत्रण बनाएं। इस तरह उपस्थिति को आंशिक वर्ग के बाहर परिभाषित किया गया है लेकिन आप उपयोगकर्ता नियंत्रण के उपयोग में आसानी खो देंगे।
मार्टिन हैरिस

1
यह है: यदि आप BaseDataType को एक सामान्य वर्ग बनाते हैं जो UserControl को विरासत में मिला है, तो यह काम करता है। उत्कृष्ट धन्यवाद।
एडवर्ड तुंगाय

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

क्या "नियंत्रण आधार" से तत्वों को बनाने का एक तरीका है जो विरासत में मिलने वाले वर्ग के शीर्ष पर हैं?
जुआन एम। एलोजगुई

2
public partial class MooringConfigurator : MooringLineConfigurator
    {
        public MooringConfigurator()
        {
            InitializeComponent();
        }
    }



<dst:MooringLineConfigurator x:Class="Wave.Dashboards.Instruments.ConfiguratorViews.DST.MooringConfigurator"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:dst="clr-namespace:Wave.Dashboards.Instruments.ConfiguratorViews.DST"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</dst:MooringLineConfigurator>    

1

मुझे इस लेख में जवाब मिला: http://www.paulstovell.com/xmlnsdefinition

मूल रूप से क्या कहते हैं कि आपको AssemlyInfo.cs फ़ाइल में XML नामस्थान को परिभाषित करना चाहिए, जिसका उपयोग XAML में किया जा सकता है। यह मेरे लिए काम करता है, हालांकि मैंने बेस यूजर कंट्रोल क्लास को अलग DLL में रखा है ...


0

मैं एक ही मुद्दे में भाग गया, लेकिन एक अमूर्त वर्ग से नियंत्रण प्राप्त करने की आवश्यकता थी, जो डिजाइनर द्वारा समर्थित नहीं है। मेरी समस्या का हल क्या है जो दोनों को एक मानक वर्ग (जो UserControl को विरासत में मिला है) और एक इंटरफेस से विरासत में मिला है। इस तरह से डिजाइनर काम कर रहा है।

//the xaml
<local:EcranFiche x:Class="VLEva.SIFEval.Ecrans.UC_BatimentAgricole" 
                  xmlns:local="clr-namespace:VLEva.SIFEval.Ecrans"
                  ...>
    ...
</local:EcranFiche>

// the usercontrol code behind
public partial class UC_BatimentAgricole : EcranFiche, IEcranFiche
{
    ...
}

// the interface
public interface IEcranFiche
{
   ...
}

// base class containing common implemented methods
public class EcranFiche : UserControl
{
    ... (ex: common interface implementation)
}

0

डिज़ाइनर द्वारा बनाई गई आंशिक वर्ग परिभाषा है, आप इसे InitializeComponent () विधि परिभाषा के माध्यम से आसान तरीका खोल सकते हैं। तो बस UserControl से BaseDataType (या आप वर्ग परिभाषा में निर्दिष्ट किसी भी) में आंशिक वर्ग iheritence बदलें।

उसके बाद आपको चेतावनी दी जाएगी कि बाल वर्ग में आरोग्यनामाकांपेंटेंट () पद्धति छिपी हुई है।

इसलिए आप बेस क्लास में आंशिक परिभाषा (जैसा कि एक टिप्पणी में वर्णित है) से बचने के लिए UserControl के बजाय बेस क्लैस के रूप में एक CustomControl बना सकते हैं।


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