2010-10-15 8 views
7

मैं कुछ दिनों के लिए निर्भरता गुणों पर पढ़ रहा हूं और समझता हूं कि वे सीएलआर गुणों के रूप में सेट/प्राप्त करने के बजाय मूल्य को कैसे प्राप्त करते हैं। अगर मैं गलत हूं तो मुझे सही करने के लिए स्वतंत्र महसूस करें।किसी मौजूदा नियंत्रण पर निर्भरता संपत्ति कैसे बनाएं?

मेरी समझ से सभी डब्लूपीएफ नियंत्रण जैसे टेक्स्टब्लॉक, बटन इत्यादि जो निर्भरता ऑब्जेक्ट से प्राप्त होते हैं, उनमें सीएलआर गुणों का उपयोग करने के बजाय निर्भरता गुण भी शामिल होंगे। एनीमेशन का उपयोग किए जाने पर स्थानीय मूल्यों को ओवरराइड करने का लाभ होता है, या मूल्यों का वारिस होता है यदि कोई स्थानीय मूल्य इत्यादि पर सेट नहीं किया जाता है।

अब मैं अपने स्वयं के डीपी बनाने और उपयोग करने के लिए कुछ नमूने के साथ आने की कोशिश कर रहा हूं।

1) क्या मौजूदा WPF नियंत्रण पर अपनी निर्भरता संपत्ति बनाना संभव है? मान लें कि मैं डब्ल्यूपीएफ टेक्स्टब्लॉक क्लास पर टाइप इंटीजर की निर्भरता संपत्ति चाहूंगा? या क्या मुझे वहां पर निर्भरता संपत्ति बनाने के लिए टेक्स्टब्लॉकबेस से व्युत्पन्न एक नई कक्षा बनाना है?

2) किसी भी मामले में, मान लें कि मैंने एक WPF टेक्स्टब्लॉक क्लास पर एक निर्भरता संपत्ति बनाई है। अब मैं टेक्स्टब्लॉक की उस निर्भरता संपत्ति पर लेबल की सामग्री को बाध्य करके इसका उपयोग करना चाहता हूं। ताकि लेबल हमेशा टेक्स्टब्लॉक के डीपी के वास्तविक मूल्य को दिखाए, चाहे वह विरासत में हो या स्थानीय रूप से सेट हो।

उम्मीद है कि कोई मुझे इन दो उदाहरणों के साथ मदद कर सकते हैं ... कई धन्यवाद, Kave

उत्तर

6

आप इसके लिए attached properties उपयोग कर सकते हैं।

अपनी संपत्ति मींट परिभाषित करें:


namespace WpfApplication5 
{ 
    public class MyProperties 
    { 
     public static readonly System.Windows.DependencyProperty MyIntProperty; 

     static MyProperties() 
     { 
      MyIntProperty = System.Windows.DependencyProperty.RegisterAttached(
       "MyInt", typeof(int), typeof(MyProperties)); 
     } 

     public static void SetMyInt(System.Windows.UIElement element, int value) 
     { 
      element.SetValue(MyIntProperty, value); 
     } 

     public static int GetMyInt(System.Windows.UIElement element) 
     { 
      return (int)element.GetValue(MyIntProperty); 
     } 
    } 
} 

बाइंड लेबल सामग्री:


<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication5" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Label Margin="98,115,51,119" Content="{Binding Path=(local:MyProperties.MyInt), RelativeSource={x:Static RelativeSource.Self}}" local:MyProperties.MyInt="42"/> 
    </Grid> 
</Window> 
+0

धन्यवाद, यह भी एक अच्छा विकल्प है, जो मैं जल्द ही कोशिश कर रहा हो जाएगा । – Houman

1

आप मौजूदा प्रकार के DependencyProperties जोड़ने नहीं कर सकते। जबकि आप अटैचडप्रोपर्टी का उपयोग कर सकते हैं, इसका उपयोग करके तर्क और नया प्रकार प्राप्त करना पूरी तरह से अलग है।

आपके मामले में मैं नए प्रकार को प्राप्त करने की सिफारिश करता हूं। मुख्य रूप से क्योंकि आपका तर्क इस प्रकार से बंधे हैं। यह विरासत के पीछे मूल है और निर्भरता गुणों से बंधे नहीं है।

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

using System; 
using System.Windows; 
using System.Windows.Documents; 

namespace MyNameSpace.FlowDocumentBuilder 
{ 
    public class ModifiedRun : Run 
    { 
     static DateRun() 
     { 
      TextProperty.OverrideMetadata(typeof(DateRun),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.Inherits,null,CoerceValue)); 
     } 

     private static object CoerceValue(DependencyObject d, object basevalue) 
     { 
      return "AAAAAAAA"; 
     } 
    } 
} 

एक इसी XAML है:

+0

धन्यवाद। मैं कभी डीपी क्यों बनाना चाहूंगा? मैंने पढ़ा है कि कुछ लोग अपने स्वयं के बनाते हैं। मैं एक उदाहरण देखना चाहता हूं जहां यह आपके स्वयं के डीपी बनाने के लिए समझ में आता है ... – Houman

0

यहाँ भागो तत्व के एक ovveride पर एक उदाहरण है

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         ColumnWidth="400" 
         FontSize="14" 
         FontFamily="Arial" 
xmlns:local="clr-namespace:MyNameSpace.FlowDocumentBuilder;assembly=MyNameSpace.FlowDocumentBuilder" 
> 

<Paragraph><local:ModifiedRun Text="BBBBBBBBBB"/></Paragraph> 

</FlowDocument> 
संबंधित मुद्दे