কীভাবে কোনও ডাব্লুপিএফ ইউজারকন্ট্রোল কোনও ডাব্লুপিএফ ব্যবহারকারীকন্ট্রোলকে উত্তরাধিকারী করতে পারে?


95

নিম্নলিখিত WPF UserControl নামক DataTypeWholeNumber যা কাজ করে।

এখন আমি ডেটাটাইপডেটটাইম এবং ডেটা টাইপ ইমেইল ইত্যাদি নামে একটি ইউজারকন্ট্রোল বানাতে চাই

নির্ভরতা বৈশিষ্ট্যগুলির অনেকগুলি এই সমস্ত নিয়ন্ত্রণ দ্বারা ভাগ করা হবে এবং তাই আমি তাদের সাধারণ পদ্ধতিগুলি বেসডেটাটাইপগুলিতে রাখতে চাই এবং এই প্রতিটি ব্যবহারকারীর এই বেস টাইপ থেকে উত্তরাধিকারী হতে চাই।

যাইহোক, আমি যখন এটি করি তখন ত্রুটিটি পাই : আংশিক ঘোষণায় বিভিন্ন বেস ক্লাস নাও থাকতে পারে

সুতরাং আমি কীভাবে ইউজারকন্ট্রোলগুলির সাথে উত্তরাধিকার প্রয়োগ করব যাতে ভাগ করা কার্যকারিতা সমস্ত বেস শ্রেণিতে থাকে?

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());



    }
}

ভিজ্যুয়াল ইনহেরিটেন্সের সাথে ডাব্লুপিএফ কাজের জন্য দেখুন: svetoslavsavov.blogspot.gr/2009/09/… বা পূর্বপুরুষের মধ্যে GUI স্পষ্টরূপে সংজ্ঞায়িত করার জন্য দেখুন সমর্থন.
microsoft.com/kb/957231

উত্তর:


132

আপনার নতুন বেসটিপ থেকে উত্তরাধিকার সূত্রে আপনি 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 এর প্রথম ট্যাগে (উপরে দেখানো হয়েছে) উভয়ই বেস ক্লাস থেকে সাবক্লাস উত্তরাধিকার সূত্রে নিশ্চিত হয়েছে।

4
আমি যখন এই পরিবর্তনটি করি তখন ত্রুটিটি পাই: "... ডেটাটাইপস.বেসডেটাটাইপ কোনও এক্সএএমএল ফাইলের মূল হতে পারে না কারণ এটি এক্সএএমএল ব্যবহার করে সংজ্ঞায়িত করা হয়েছিল", আপনি কীভাবে এই বিজ্ঞপ্তি রেফারেন্স থেকে বেরিয়ে আসবেন?
এডওয়ার্ড টাঙ্গুয়ে

9
আপনি যদি কেবলমাত্র বেস ক্লাসটিকে একটি সাধারণ ধরণের করতে পারেন যা কোনও এক্সমাল সংজ্ঞায়িত না করেই ইউজারকন্ট্রোল থেকে উত্তরাধিকার সূত্রে আসে (সুতরাং দুটি ফাইলের উপর আংশিক শ্রেণি বিভক্ত নয়)। সমস্যাটি হ'ল আপনি xmal উত্তরাধিকারী হতে পারবেন না, তাই বেস বা শিশু শ্রেণীর উভয়কেই একটি xmal ফাইল না রাখা দরকার। হয় বা আপনার ক্লাসগুলি ব্যবহারকারীর নিয়ন্ত্রণগুলির পরিবর্তে কাস্টম নিয়ন্ত্রণ করুন। এইভাবে আংশিক শ্রেণীর বাইরে চেহারা সংজ্ঞায়িত করা হয়েছে তবে আপনি কোনও ব্যবহারকারী নিয়ন্ত্রণের ব্যবহারের সহজতা হারাবেন।
মার্টিন হ্যারিস

4
এটি হ'ল: যদি আপনি বেসডাটাটাইপটিকে একটি সাধারণ বর্গ তৈরি করেন যা ইউজারকন্ট্রোলকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, তবে এটি কার্যকর হয়। দুর্দান্ত, ধন্যবাদ
এডওয়ার্ড টাঙ্গুয়ে

@ মার্টিন আপনার মন্তব্যটি প্রতিবিম্বিত করতে আপনার উত্তরটি আপডেট করতে পারেন এবং এটিই আসল উত্তর।
ব্রায়ান অ্যান্ডারসন

ক্লাসের যে অংশগুলি উত্তরাধিকারসূত্রে পেয়েছে তাদের উপরে "নিয়ন্ত্রণ বেস" থেকে উপাদান তৈরি করার কোনও উপায় আছে?
জুয়ান এম ইলোসেগুই

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

মূলত যা বলা হয় তা হ'ল আপনার এসেমলিআইএনফো সি সি ফাইলের একটি এক্সএমএল নেমস্পেসের সংজ্ঞা দেওয়া উচিত, যা এক্সএএমএল-এ ব্যবহার করা যেতে পারে। এটি আমার পক্ষে কাজ করেছে, তবে আমি বেস ব্যবহারকারী নিয়ন্ত্রণ শ্রেণিকে একটি পৃথক ডিএলএলে রেখেছি ...


0

আমি একই ইস্যুতে দৌড়েছি তবে একটি বিমূর্ত শ্রেণীর কাছ থেকে নিয়ন্ত্রণ উত্তরাধিকারী হওয়া দরকার, যা ডিজাইনার সমর্থন করে না। আমার সমস্যার সমাধানটি যা ব্যবহারকারীকন্ট্রোলকে একটি স্ট্যান্ডার্ড ক্লাস (যা ইউজারকন্ট্রোলকে উত্তরাধিকারী করে) এবং ইন্টারফেস উভয় থেকে উত্তরাধিকারী করে তুলেছে। এইভাবে ডিজাইনার কাজ করছে।

//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

ডিজাইনার দ্বারা আংশিক শ্রেণীর সংজ্ঞা তৈরি করা হয়েছে, আপনি ইনিশিয়ালকম্পোনেন্ট () পদ্ধতির সংজ্ঞা দিয়ে এটি সহজ উপায়ে খুলতে পারেন। তারপরে কেবল ইউজারকন্ট্রোল থেকে বেসডাটাটাইপ (বা আপনি শ্রেণীর সংজ্ঞায় নির্দিষ্ট করে যে কোনও) আংশিক শ্রেণীর আইরিটিেন্স পরিবর্তন করুন।

এর পরে আপনার সতর্কতা থাকবে যে প্রাথমিক শ্রেণিবদ্ধ () পদ্ধতিটি শিশু শ্রেণিতে লুকানো আছে।

অতএব বেস ক্লাসে আংশিক সংজ্ঞা এড়াতে আপনি ইউজারকন্ট্রোলের পরিবর্তে বেস সংঘর্ষ হিসাবে কাস্টমকন্ট্রোল তৈরি করতে পারেন (একটি মন্তব্যে বর্ণিত হিসাবে)।


নিয়ন্ত্রণগুলি.লগিন থেকে নিয়ন্ত্রণগুলিতে রূপান্তর করতে পারে না ase বেসকন্ট্রোল।
হিমিলু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.