2010-08-26 11 views
9

मैं मूल WPF TickBar की उपस्थिति को अनुकूलित करना चाहता हूं। मैं सोच रहा था कि नियंत्रण टेम्पलेट का उपयोग करके ऐसा करने का एक आसान तरीका था:WPF टिकबार पर टिकों के स्थान पर स्ट्रिंग मानों का उपयोग कैसे करें?

मैं टिकबार के साथ टिकों की जगहों की संख्या रखना चाहता हूं। मैं संख्या की स्थिति स्लाइडर के मूल्य से मेल खाना चाहता हूं (लिंक में तस्वीर की तरह)।

मैंने चारों ओर खोज की है और एक सुझाव है कि मैंने TickBar से विरासत प्राप्त करने वाली कक्षा बनाने और OnRender विधि को ओवरराइड करने के लिए कहा है।

मुझे ऐसा समाधान मिल जाएगा जो इसमें शामिल नहीं है। मैं वास्तव में एक नियंत्रण टेम्पलेट का उपयोग कर उम्मीद कर रहा था चाल चलाना होगा। इसलिए, यदि ऐसा कोई समाधान है, तो सुझावों की बहुत सराहना की जाएगी!

एक सुपर तेजी से ठीक Topright करने के लिए स्लाइडर पर AutoToolTipPlacemant गुण सेट करने के लिए होगा: :)

उत्तर

16

ठीक है, मेरे पास एक समाधान है। मैंने सोचा कि मुझे घटना में अपने प्रश्न का उत्तर देना चाहिए क्योंकि लाइन के साथ कुछ अन्य साथी एक ही स्थिति में चलाते हैं I :-)

ओवरराइड OnRender सबसे स्पष्ट समाधान प्रतीत होता है। मैं वास्तव में एक प्रकार के टेम्पलेट का उपयोग करने की उम्मीद कर रहा था ... श्वास ... आह ठीक है। वैसे भी, मैं एमएसडीएन के मंचों पर this discussion भर गया, जिसने मुझे सही दिशा में भेजने का उत्तर दिया। सुझाव के लिए

class CustomTickBar : TickBar 
{ 
    protected override void OnRender(System.Windows.Media.DrawingContext dc) 
    { 
     double num = this.Maximum - this.Minimum; 
     double y = this.ReservedSpace * 0.5; 
     FormattedText formattedText = null; 
     double x = 0; 
     for(double i = 0; i <= num; i += this.TickFrequency) 
     { 
      formattedText = new FormattedText(i.ToString(), FlowDirection.LeftToRight, 
       new Typeface("Verdana"), 8, Brushes.Black); 
      if(this.Minimum == i) 
       x = 0; 
      else 
       x += this.ActualWidth/(num/this.TickFrequency) ; 
      dc.DrawText(formattedText, new Point(x, 10)); 
     } 
    } 
} 
+1

क्यों 'ऑनरेंडर' मेरी सर्वश्रेष्ठ शर्त है: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2f4a9b7-18cd-4544-91b1-52dc0b2b93a6 असल में, टिकबार उपयोग करता है अपने दृश्य प्रस्तुत करने के लिए निम्न स्तर 'ऑनरेंडर' तंत्र। –

1

यहाँ 2 तेज़ और आसान समाधान है कि काम करते हैं लेकिन सर्वोत्तम प्रथाओं नहीं माना जाना चाहिए रहे हैं। इसका मतलब है कि स्लाइडर खींचते समय संख्या टूलटिप में दिखाई देगी।

विकल्प 2 alt text

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

इस समस्या को हल करने का एक उचित तरीका है, लेकिन यदि आपको इसे जल्दी से करने की आवश्यकता है और ऑनरेंडर को ओवरराइड करना शुरू करने या पूरी तरह से नया नियंत्रण करने के लिए परेशान नहीं किया जा सकता है तो इन तरीकों से नौकरी अधिक तेज़ी से हो जाएगी।

(इस उत्तर पोस्ट के लेखक घटिया प्रथाओं कोडिंग या अपने सॉफ्टवेयर में यह ऐसा करने का उचित तरीके के लिए एक विकल्प के रूप में इन तकनीकों का उपयोग पुष्टि करना कोई रास्ता नहीं में करता है: वे कर रहे हैं बस त्वरित सुधार) :-)

+0

धन्यवाद:

सरल, और यह और अधिक लचीला बनाने के लिए कुछ tweeks की जरूरत है, इसलिए यहाँ मेरी संस्करण है। हालांकि, मुझे लगता है कि मैं अब उनसे बचूंगा। :) ऐसा लगता है कि 'ऑनरेंडर' सबसे अच्छा विकल्प है। –

0
public class CustomTickBar:TickBar 
{ 
    protected override void OnRender(DrawingContext dc) 
    { 
     Size size = new Size (base.ActualWidth,base.ActualHeight); 

     int tickCount = (int)((this.Maximum - this.Minimum)/this.TickFrequency)+1; 

     if ((this.Maximum - this.Minimum) % this.TickFrequency == 0) 

      tickCount -= 1; 

     Double tickFrequencySize; 

     // Calculate tick's setting 

     tickFrequencySize = (size.Width * this.TickFrequency/(this.Maximum - this.Minimum)); 

     string text = ""; 

     FormattedText formattedText = null; 

     double num = this.Maximum - this.Minimum; 

     int i = 0; 

     // Draw each tick text 

     for (i = 0;i <= tickCount;i++) 
     { 
      text = Convert.ToString (Convert.ToInt32 (this.Minimum + this.TickFrequency * i),10); 

      //g.DrawString(text, font, brush, drawRect.Left + tickFrequencySize * i, drawRect.Top + drawRect.Height/2, stringFormat); 

      formattedText = new FormattedText (text,CultureInfo.GetCultureInfo ("en-us"),FlowDirection.LeftToRight,new Typeface ("Verdana"),8,Brushes.Black); 

      dc.DrawText (formattedText,new Point ((tickFrequencySize * i),30)); 
     } 

    } 
}