2009-11-26 9 views
7

ऐसा लगता है कि ControlTemplate में निम्नलिखित एलीप्स को सीमाबद्धता नहीं मिलती है, लेकिन क्यों?डब्ल्यूपीएफ: स्ट्रोक के लिए टेम्पलेट बाइंडिंग आकार की चिकनाई काम नहीं करती है?

<Window.Resources> 
    <ControlTemplate x:Key="EllipseControlTemplate" TargetType="{x:Type TextBox}"> 
     <Grid> 
      <Ellipse 
       Width="{TemplateBinding ActualWidth}" 
       Height="{TemplateBinding ActualHeight}" 
       Stroke="{TemplateBinding Foreground}" 
       StrokeThickness="{TemplateBinding BorderThickness}" /> 
       <ScrollViewer Margin="0" x:Name="PART_ContentHost" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <TextBox 
     Template="{DynamicResource EllipseControlTemplate}" 
     Foreground="Green" 
     BorderThickness="15" /> 
</Grid> 

TemplateBinding Foreground लिए काम करता है ठीक, अंडाकार हरे रंग का है। लेकिन StrokeThickness पर यह काम नहीं कर रहा है, क्यों?

उत्तर

4

BorderThickness नहीं है कि आसान है, यह प्रकार Thickness की एक struct है (और समग्र हो सकता है, BorderThickness=".0,.0,2,2" की तरह) है, जबकि StrokeThickness संपत्ति प्रकार double की है।

इस बाध्यकारी काम को करने के लिए आपको IValueConverter की आवश्यकता है।

+0

से क्षमा कर सकते हैं, मैं क्षमा चाहता हूं, मुझे पहले ही जवाब मिल गया है। मैंने जो जवाब लिखा है उसे देखें ... आप शायद इसका मतलब था। – Ciantic

+0

आपके लिए अच्छा :) फिर भी, मेरा पहले था :) –

+0

सच है! यदि आप टाइप फर्क का उल्लेख करते हैं, तो मैं आपको समाधान के रूप में चुनूंगा, यह यहां कुंजी है। – Ciantic

1

नामांकन नाम था: BorderThicknessThickness का प्रकार है, और StrokeThicknessdouble का प्रकार है। तो हमें IValueConverter की आवश्यकता है।

<Ellipse DataContext="{TemplateBinding BorderThickness}" StrokeThickness="{Binding Top}" /> 

आशा इस मदद करता है:

0

तुम भी दीर्घवृत्त की DataContext संपत्ति का उपयोग कर सकते हैं!

12

एक अन्य संभावित समाधान ... (क्योंकि मैं एक अंतिम उपाय के रूप में IValueConverters का उपयोग करना चाहते हैं, और दीर्घवृत्त के DataContext बदल रहा है आप की जरूरत है अगर यह कुछ और करने के लिए स्थापित किया जाना काम नहीं कर सकते):

<Ellipse StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}" /> 

यह मूल उद्देश्य (टेम्पलेटेड पेरेंट से जुड़ने के लिए) के बराबर है, लेकिन लंबे हाथ के मार्कअप का उपयोग करने से आप केवल

+0

इस महान उत्तर पर नाइट-पिक: मुझे लगता है कि 'सीमाबद्धता' लेफ्ट वास्तव में उपयोग करने के लिए पसंदीदा मूल्य है क्योंकि यह पहला मान है। [मार्जिन के बारे में यह उत्तर] देखें (https://stackoverflow.com/a/8522026/1518546) लेकिन [आदेश मोटाई के लिए समान है] (https://docs.microsoft.com/en-us/dotnet/api /system.windows.thickness#xaml-values)। –

संबंधित मुद्दे