WPF

2011-12-21 7 views
13

में स्टाइल मानों को ओवरराइड करने का उचित तरीका मैं WPF में DataGrid की सेल शैली संपादित करना चाहता हूं। तो अभिव्यक्ति मिश्रण का उपयोग करते हुए मैं सही करने के लिए जाने - वस्तुओं और समय >> डेटा ग्रिड >> अतिरिक्त टेम्पलेट्स संपादित करें >> संपादित CellStyle >> एक कॉपी संपादित करें
यहाँ क्या पृष्ठ पर दिखाई देता है:WPF

<SolidColorBrush x:Key="{x:Static DataGrid.FocusBorderBrushKey}" Color="#FF000000"/> 
<Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

लेकिन मैं केवल चाहते हैं पैडिंग और पृष्ठभूमि को बदलने के लिए। इसके बजाय उसने मुझे सेल टेम्पलेट समेत कोड की 25 लाइनें दी हैं! क्या मुझे कुछ याद आ रहा है, क्या इस तरह के सामानों को स्टाइल करने का एक बेहतर तरीका है जब मैं केवल दो आइटम बदलना चाहता हूं तो इतना अतिरिक्त अनावश्यक कोड लाए बिना?

उत्तर

30

चेक आउट "basedon" शैलियाँ के लिए विशेषता ...

उदाहरण के लिए निम्नलिखित शैली सब कुछ लेता से DataGridColumnHeader और केवल

<Style x:Key="CenterAlignedColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}" 
     BasedOn="{StaticResource {x:Type DataGridColumnHeader}}"> 
    <Setter Property="HorizontalContentAlignment" Value="Center"/> 
</Style> 
+1

बहुत बढ़िया सुविधा: HorizontalContentAlignment संपत्ति ओवरराइड करता है। मुझे प्लगइन डीएलएस का उपयोग करने में मदद मिली, बिना मेरी काम की एक टन मुझे बचाने के लिए। धन्यवाद! –

2

WPF में नियंत्रण टेम्पलेट ओवरराइड करने के लिए आपको टेम्पलेट को पूरी तरह से प्रतिस्थापित करने की आवश्यकता है। हो सकता है कि आप टेम्पलेट के केवल एक पहलू को बदलना चाहें, लेकिन इसका परिणाम अभिव्यक्ति को शेष टेम्पलेट की एक प्रति डंप कर रहा है ताकि इसे ओवरराइड किया जा सके। सुनिश्चित करें कि आप सेल को उचित तरीके से ओवरराइड कर रहे हैं (मुझे यकीन नहीं है कि एक और तरीका है)। कुछ नियंत्रण (ListView दिमाग में आता है) आपको संपूर्ण नियंत्रण टेम्पलेट को ओवरराइड किए बिना डेटा टेम्पलेट्स को स्वैप करने देगा, लेकिन मुझे यकीन नहीं है कि आप यही चाहते हैं, या यदि यह DataGrid के साथ किया जा सकता है।

इसका जवाब देखें: Replace part of default template in WPF

2

क्या आप क्या करना चाहते करने के लिए, आप आम तौर पर सिर्फ एक शैली में पृष्ठभूमि और पैडिंग गुण सेट होगा:

<Style TargetType="DataGridCell"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Background" Value="Green" /> 
</Style> 

हालांकि इस मामले में ऐसा लगता है कि DataGridCell के लिए डिफ़ॉल्ट नियंत्रण टेम्पलेट पैडिंग मान को अनदेखा करता है, इसलिए आपको इसे कार्यान्वयन के साथ प्रतिस्थापित करने की आवश्यकता होगी जो नहीं है। निम्नलिखित डिफ़ॉल्ट टेम्पलेट है कि आप पोस्ट पर आधारित है:

<Style TargetType="DataGridCell"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Background" Value="Green" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DataGridCell}"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Background="{TemplateBinding Background}" 
        SnapsToDevicePixels="True"> 
       <ContentPresenter 
        Margin="{TemplateBinding Padding}" <!-- this bit does the padding --> 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
संबंधित मुद्दे

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