2009-03-19 18 views
45

मैं एक डब्ल्यूपीएफ विस्तारक शीर्षलेख पर एक शैली लागू करना चाहता हूं। निम्नलिखित एक्सएएमएल में मेरे पास एक्सपेंडर है लेकिन शैली केवल हेडर के लिए ही नहीं है।एक WPF विस्तारक शीर्षलेख कैसे शैलीबद्ध करें?

धन्यवाद।

<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Width="640" 
> 
    <StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="Expander"> 
       <Style.Resources> 
        <LinearGradientBrush x:Key="BackBrush" StartPoint="0.5,0" EndPoint="0.5,1"> 
         <GradientStop Color="#EF3132" Offset="0.1" /> 
         <GradientStop Color="#D62B2B" Offset="0.9" /> 
        </LinearGradientBrush> 
       </Style.Resources> 
       <Setter Property="Background" Value="{StaticResource BackBrush}"/> 
      </Style> 
     </StackPanel.Resources> 
     <Expander> 
      <StackPanel> 
       <TextBlock>Bike</TextBlock> 
       <TextBlock>Car</TextBlock> 
       <TextBlock>Truck</TextBlock> 
      </StackPanel> 
     </Expander> 
    </StackPanel> 
</Page> 

उत्तर

50

में भेजे गए नियंत्रण टेम्पलेट्स पर एक नज़र डालें मैंने Josh Smith और MSDN से कुछ XAML को जोड़ा है और समाधान के साथ आया है। दरअसल, नियंत्रण (कम से कम हेडर) को पुनः संयोजित किया जाना चाहिए।

<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Width="400"> 
    <StackPanel> 
     <StackPanel.Resources> 

      <Style TargetType="Border" x:Key="RacePitBorderStyle" > 
       <Style.Resources> 
        <LinearGradientBrush x:Key="BackBrush" StartPoint="0.5,0" EndPoint="0.5,1"> 
         <GradientStop Color="#EF3132" Offset="0.1" /> 
         <GradientStop Color="#D62B2B" Offset="0.9" /> 
        </LinearGradientBrush> 
       </Style.Resources> 
       <Setter Property="Background" Value="{StaticResource BackBrush}"/> 
      </Style> 

      <DataTemplate x:Key="titleText"> 
       <Border Style="{StaticResource RacePitBorderStyle}" Height="24"> 
        <TextBlock Text="{Binding}" 
         Margin="4 0" 
         VerticalAlignment="Center" 
         Foreground="White" 
         FontSize="11" 
         FontWeight="Normal" 
         Width="{Binding 
         RelativeSource={RelativeSource 
         Mode=FindAncestor, 
         AncestorType={x:Type Expander}}, 
         Path=ActualWidth}" 
         TextWrapping="Wrap"/> 
       </Border> 
      </DataTemplate> 

      <Style TargetType="{x:Type Expander}"> 
       <Setter Property="HeaderTemplate" Value="{StaticResource titleText}"/> 
      </Style> 

     </StackPanel.Resources> 

     <Expander Name="hcontCtrl" Header="This is the header."> 
      <StackPanel> 
       <TextBox>This is a textbox</TextBox> 
       <Button>A button</Button> 
      </StackPanel> 
     </Expander> 

    </StackPanel> 
</Page> 
+2

मैंने पाया विस्तारक हो रही एक वास्तविक समस्या चौड़ाई, और आप कोड इस करता है: क्या आप वाकई क्या वे इस पृष्ठभूमि है, जो शायद वांछित है के साथ क्या की सम्पूर्णता लपेट बनाना चाहते हैं, कि कैसा दिखेगा। यह flamlessly xamlpad में काम करता है। हालांकि मेरे कोड में यह भयानक ग्राफिकल अंतराल नहीं करता है और इसका कारण बनता है। चौड़ाई = "{बाध्यकारी सापेक्ष स्रोत {सापेक्ष स्रोत मोड = FindAncestor टाइप = {x: टाइप एक्सपेंडर}}, पथ = वास्तविक Width}"> ऊपर जोड़कर यह काम करता है, लेकिन झटके। अगर मैं इसे हटा देता हूं, या पथ = चौड़ाई बदलता हूं, तो यह काम नहीं करता है और अंतराल दूर हो जाता है। XamlPad – JonWillis

+0

+1 जॉनविल्लिस को +1 जो मुझे चाहिए था। धन्यवाद! कभी-कभी एक्सएएमएल में गहरी खोदना सिरदर्द होता है। – surfen

+1

के लिए –

6

निर्भर करता है कि आप क्या शैली बनाना चाहते हैं - आप इसका कोई भी हिस्सा शैली बना सकते हैं। यदि आप शीर्षलेख में सामग्री को बदलना चाहते हैं, तो बस अपने सभी UI को Expander.Header प्रॉपर्टी में रखें, और यह हेडर क्षेत्र में दिखाएगा।

यदि यह आपकी आवश्यकताओं को पूरा नहीं करता है, तो आपको शायद नियंत्रण को फिर से टेम्पलेट करने की आवश्यकता है। WPF here

11

मुझे लगता है कि Vasile का जवाब सही रास्ते पर है, लेकिन ऐसा लगता है जैसे कि यह जरूरत मूल पोस्टर तुलना में बहुत अधिक है। सभी मूल प्रश्न हेडर की पृष्ठभूमि को बदलने के लिए करना था। जबकि प्रस्तुत परिवर्तन यह करता है, यह अन्य चीजें भी करता है।

इन अन्य चीजों में से एक डिफ़ॉल्ट कार्यान्वयन को प्रतिस्थापित करना है, मैं एक टेक्स्टबेलर के साथ एक सामग्री प्रतिनिधि मानता हूं। तो क्या होता है जब बाद में हम इस स्टैकेपनेल में दूसरा विस्तारक जोड़ते हैं? शायद कुछ ऐसा हो सकता है:

<Expander> 
    <Expander.Header> 
     <StackPanel> 
      <Border height="5" width="5" Foreground="Blue"/> 
      <TextBlock>Ha!</TextBlock> 
     </StackPanel> 
    </Expander.Header> 
</Expander> 

मुझे नहीं पता, लेकिन यह अच्छा नहीं है। इसके बजाए, मुझे लगता है कि हम इसे सरल रखना चाहते हैं।

<DataTemplate x:Key="expanderHeader"> 
    <ContentPresenter 
     Content={Binding} 
     TextBlock.Background={StaticResource myBrush}/> 
</DataTemplate> 

<Style TargetType="Expander"> 
    <Setter Property="HeaderTemplate" Value="{StaticResource expanderHeader}"/> 
</Style> 

इस तरह जब कोई ऐसा कुछ रखता है जो हमारे स्टाइल विस्तारक में सिर्फ टेक्स्ट नहीं है, तो हम नहीं तोड़ते हैं।

<DataTemplate x:Key="expanderHeader"> 
    <Border Background={StaticResource myBrush}> 
     <ContentPresenter Content={Binding}/> 
    </Border> 
</DataTemplate> 
संबंधित मुद्दे