2009-04-23 9 views
6

में नियंत्रण टेम्पलेट के केवल एक हिस्से को ओवरराइड कर सकते हैं क्या xaml में नियंत्रण के पूरे नियंत्रण टेम्पलेट को फिर से बनाने के बिना नियंत्रण टेम्पलेट के किसी विशिष्ट भाग को बदलना या संशोधित करना संभव है?क्या आप Silverlight

उदाहरण के लिए, मैं टेक्स्टबॉक्स की सीमा से छुटकारा पाने की कोशिश कर रहा था, इसलिए मैं गोलाकार कोनों (उदाहरण नीचे xaml) के साथ एक मूल खोज बॉक्स फेंक सकता था। जब तक आप टेक्स्टबॉक्स पर माउस नहीं डालते हैं और नियंत्रण में जोड़े गए छद्म सीमा को तब तक बढ़ाया जाता है जब तक सीमावर्तीता को 0 तक ठीक से सेट नहीं किया जाता है। यदि मैं टेक्स्टबॉक्स के लिए नियंत्रण टेम्पलेट को देखता हूं, तो मैं दृश्य स्थिति का नाम भी देख सकता हूं, लेकिन इसे अक्षम करने के बारे में नहीं सोच सकता।

टेक्स्टबॉक्स के नियंत्रण टेम्पलेट को ओवरराइड किए बिना, मैं विजुअल स्टेट मैनेजर को टेक्स्टबॉक्स पर प्रभाव से माउस को फायर करने से कैसे रोकूं?

<Border Background="White" CornerRadius="10" VerticalAlignment="Center" HorizontalAlignment="Center" BorderThickness="3" BorderBrush="#88000000"> 
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Margin="5,0,0,0"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="16" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Path Height="13" Width="14" Stretch="Fill" Stroke="#FF000000" StrokeThickness="2" Data="M9.5,5 C9.5,7.4852815 7.4852815,9.5 5,9.5 C2.5147185,9.5 0.5,7.4852815 0.5,5 C0.5,2.5147185 2.5147185,0.5 5,0.5 C7.4852815,0.5 9.5,2.5147185 9.5,5 z M8.5,8.4999971 L13.5,12.499997" /> 
      <TextBox GotFocus="TextBox_GotFocus" Background="Transparent" Grid.Column="1" BorderThickness="0" Text="I am searchtext" Margin="5,0,5,0" HorizontalAlignment="Stretch" /> 
    </Grid> 
</Border> 

उत्तर

5

मैं यह करने के लिए एक रास्ता मिल गया है नियंत्रण बंद इनहेरिट और OnApplyTemplate अधिभावी द्वारा,। यह आदर्श नहीं है, लेकिन मुझे लगता है कि पूरे नियंत्रण टेम्पलेट की प्रतिलिपि बनाने से बेहतर है। यहाँ सीमारहित पाठ बॉक्स बनाने, अनिवार्य रूप से हमेशा स्टोरीबोर्ड को साफ़ करके दृश्य राज्य पर माउस को अक्षम करने का एक उदाहरण है:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media.Animation; 

namespace SilverlightTestApplication 
{ 
    public class BorderlessTextBox : TextBox 
    { 
     public BorderlessTextBox() 
     { 
      BorderThickness = new System.Windows.Thickness(0); 
     } 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 

      //Get the mouse over animation in the control template 
      var MouseOverVisualState = GetTemplateChild("MouseOver") as VisualState; 

      if (MouseOverVisualState == null) 
       return; 

      //get rid of the storyboard it uses, so the mouse over does nothing 
      MouseOverVisualState.Storyboard = null; 
     } 
    } 
} 
2

यह थोड़ी देर के बाद से मैंने एक्सएएमएल का उपयोग किया, लेकिन नहीं, मुझे विश्वास नहीं है कि आप टेम्पलेट के एक टुकड़े को संशोधित कर सकते हैं।

हालांकि यदि आपके पास आईडीई है तो आप वर्तमान में लागू टेम्पलेट की एक प्रति बना सकते हैं और बस उस टुकड़े को संशोधित कर सकते हैं जिसे आप चाहते हैं और बाकी को छोड़ दें। this link.

+0

है ठीक ऐसे ही है कि मैं क्या :) यह सिर्फ 'एक कट की तरह लगता है n करने के लिए होने से बचने की कोशिश कर रहा हूँ पेस्ट आपदा होने का इंतजार! दुर्भाग्यवश, – mattmanser

+0

दुर्भाग्यवश, मुझे लगता है कि यह एकमात्र तरीका है क्योंकि यह संपूर्ण रूप से टेम्पलेट को लागू करता है न केवल व्यक्तिगत टुकड़े। हालांकि मैं किसी विशेषज्ञ से नहीं हूं, मुझे ऐसा करने का कोई तरीका नहीं मिला है। – Brandon

0

XAML रीडर के साथ प्रत्येक नियंत्रण का डिफ़ॉल्ट टेम्पलेट पुनर्प्राप्त करें, फिर कॉपी/पेस्ट करें और संशोधित करें जो आप चाहते हैं ... बहुत साफ नहीं है लेकिन मुझे लगता है कि यह एकमात्र तरीका है (मैं 'यह कैसे डिफ़ॉल्ट टेम्पलेट)

0

WPF में, सुनिश्चित करें Silverlight यहां एयरो के टेम्पलेट पुनः प्राप्त करने के लिए एक कोड स्निपेट के बारे में नहीं पुनः प्राप्त करने के लिए खोज रहा हूँ, आप प्रतिलिपि बनाने/चिपकाने और परिवर्तन आप चाहते करने के लिए प्रयास कर सकते हैं:

 public Window1() 
     { 
      InitializeComponent(); 
      using(FileStream fs = new FileStream("C:/TextBoxTemplate.xaml", FileMode.Create)) 
      { 
       var res = LoadThemeDictionary(typeof(TextBox), "Aero", "NormalColor"); 
       var buttonRes = res[typeof(TextBox)]; 
       XamlWriter.Save(buttonRes, fs); 
      } 
     } 

     public static ResourceDictionary LoadThemeDictionary(Type t, 
     string themeName, string colorScheme) 
     { 
      Assembly controlAssembly = t.Assembly; 
      AssemblyName themeAssemblyName = controlAssembly.GetName(); 

      object[] attrs = controlAssembly.GetCustomAttributes(
        typeof(ThemeInfoAttribute), false); 
      if(attrs.Length > 0) 
      { 
       ThemeInfoAttribute ti = (ThemeInfoAttribute)attrs[0]; 

       if(ti.ThemeDictionaryLocation == 
                 ResourceDictionaryLocation.None) 
       { 
        // There are no theme-specific resources. 
        return null; 
       } 

       if(ti.ThemeDictionaryLocation == 
           ResourceDictionaryLocation.ExternalAssembly) 
       { 
        themeAssemblyName.Name += "." + themeName; 
       } 
      } 

      string relativePackUriForResources = "/" + 
        themeAssemblyName.FullName + 
        ";component/themes/" + 
        themeName + "." + 
        colorScheme + ".xaml"; 

      Uri resourceLocater = new System.Uri(
        relativePackUriForResources, System.UriKind.Relative); 

      return Application.LoadComponent(resourceLocater) 
           as ResourceDictionary; 
     } 

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

स्रोत: Default template in WPF

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