2010-04-16 10 views
26

जब आप WPF में Grid पर अस्पष्टता सेट करते हैं, तो सभी बच्चे तत्व Opacity का उत्तराधिकारी दिखाई देते हैं। आपके बच्चे के तत्व को माता-पिता की अस्पष्टता का वारिस नहीं हो सकता है?आप WPF में अभिभावक नियंत्रण की अस्पष्टता को कैसे ओवरराइड करते हैं?

उदाहरण के लिए, निम्नलिखित अभिभावक ग्रिड में पृष्ठभूमि में लाल रंग के सेट के साथ बीच में एक बच्चा ग्रिड होता है, लेकिन माता-पिता की अस्पष्टता के कारण पृष्ठभूमि गुलाबी दिखाई देती है। मैं एक ठोस रंग के लिए बच्चे को ग्रिड चाहते हैं, गैर पारदर्शी पृष्ठभूमि:

<Grid x:Name="LayoutRoot"> 

    <Grid Background="Black" Opacity="0.5"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="0.333*"/> 
     <RowDefinition Height="0.333*"/> 
     <RowDefinition Height="0.333*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0.333*"/> 
     <ColumnDefinition Width="0.333*"/> 
     <ColumnDefinition Width="0.333*"/> 
    </Grid.ColumnDefinitions> 

    <-- how do you make this child grid's background solid red 
     and not inherit the Opacity/Transparency of the parent grid? --> 
    <Grid Grid.Column="1" Grid.Row="1" Background="Red"/> 
    </Grid> 

</Grid> 

उत्तर

37

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

<Grid x:Name="LayoutRoot">  
     <Grid> 
     <Grid.Background> 
      <SolidColorBrush Color="Black" Opacity="0.5"/> 
     </Grid.Background> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.333*"/> 
      <RowDefinition Height="0.333*"/> 
      <RowDefinition Height="0.333*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.333*"/> 
      <ColumnDefinition Width="0.333*"/> 
      <ColumnDefinition Width="0.333*"/> 
     </Grid.ColumnDefinitions> 

     <Grid Grid.Column="1" Grid.Row="1" Background="Red" /> 
     </Grid> 
</Grid> 
+0

धन्यवाद मुख्य। ठोस रंग ब्रश चाल चल रहा था! और StackOverflow \ (* _ *)/ –

+0

में आपका स्वागत है क्या आपके पास उस साइट का लिंक है जहां इसे लागू किया गया है? मैं शुद्ध एचटीएमएल/सीएसएस 3 में अस्पष्टता को ओवरराइड करने की कोशिश कर रहा हूं और वास्तव में इस दृष्टिकोण के परिणामस्वरूप एचटीएमएल देखना चाहता हूं। –

+1

शानदार! यह दुखद है वीएस में विरासत माता-पिता की विरासत के बीच अंतर करने के लिए अंतर्निहित तरीका नहीं है या नहीं। यह ग्रिड से अधिक के लिए काम करता है, मैंने इस तकनीक को सामान्य अस्पष्टता सामग्री के साथ अर्ध-पारदर्शी टैबकंट्रोल प्राप्त करने के लिए कार्यान्वित किया है। –

1

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

<Grid Grid.Column="0" 
     Grid.Row="1" 
     Background="Red" 
     Opacity="1" /> 

<Grid Grid.Column="1" 
     Grid.Row="1" 
     Background="Green" /> 

<Grid Grid.Column="2" 
     Grid.Row="1" 
     Background="Blue" /> 

लेकिन यदि आप सभी बच्चों को माता-पिता की अस्पष्टता का पालन करने के अलावा छोड़ना चाहिए जो थोड़ा अधिक कंप है licated। आप इसे कंट्रोल टेम्पलेट और अल्फा चैनलों या अस्पष्टता मुखौटा के साथ कुछ चालाक चाल के साथ ऐसा करने में सक्षम हो सकते हैं। यदि नहीं, तो आप किसी प्रकार का कस्टम नियंत्रण बना सकते हैं जिसने आपको वह व्यवहार दिया जो आप चाहते थे। मुझे इस बारे में सोचना होगा कि उस प्रकार के परिदृश्य के लिए सबसे अच्छा समाधान क्या हो सकता है।

+0

इरादा माता-पिता की अस्पष्टता का पालन करने के अलावा सभी बच्चों को रखना है। शायद कुछ ऐसा है जो कस्टम नियंत्रण के बिना देशी xaml में सेट किया जा सकता है? –

3

आप अपने लेआउट ग्रिड के अंदर केवल दो ग्रिड ओवरले कर सकते हैं। सबसे पहले आपके ग्रिड के रूप में परिभाषित किया जाएगा, अपने लाल innermost ग्रिड को कम करें। दूसरा पारदर्शी पृष्ठभूमि के साथ, समान कॉलम और पंक्तियों के साथ परिभाषित किया जाएगा। इस ग्रिड का एकमात्र बच्चा आपका सबसे बड़ा ग्रिड होगा।

<Grid x:Name="LayoutRootNew" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch"> 

     <Grid Background="Black" Opacity="0.5"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="0.333*"/> 
       <RowDefinition Height="0.333*"/> 
       <RowDefinition Height="0.333*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.333*"/> 
       <ColumnDefinition Width="0.333*"/> 
       <ColumnDefinition Width="0.333*"/> 
      </Grid.ColumnDefinitions> 

      <TextBlock Grid.Column="0" Grid.Row="0"> 
       Here is some content in a somewhat transparent cell 
      </TextBlock> 

     </Grid> <!-- End of First Grid --> 

     <!-- Second grid --> 
     <Grid Background="Transparent"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="0.333*"/> 
       <RowDefinition Height="0.333*"/> 
       <RowDefinition Height="0.333*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.333*"/> 
       <ColumnDefinition Width="0.333*"/> 
       <ColumnDefinition Width="0.333*"/> 
      </Grid.ColumnDefinitions> 

      <Grid Grid.Column="1" Grid.Row="1" Background="Red"> 
       <TextBlock Foreground="White" Text="Here Is Your Red Child" /> 
      </Grid> <!-- Inner Child Grid --> 
     </Grid> <!-- End of Second Grid --> 
    </Grid>  <!-- Layout Grid --> 
+0

@ वोंको, धन्यवाद। यह विधि मुख्य कारण के उत्तर के लिए एक अच्छा विकल्प है। –

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

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