मुझे नियंत्रण अन्य सभी नियंत्रणों के ऊपर दिखाई देने की आवश्यकता है, इसलिए यह आंशिक रूप से उन्हें ओवरले करेगा।अन्य सभी नियंत्रणों के ऊपर ओवरले नियंत्रण कैसे बनाएं?
उत्तर
आप एक कैनवास या अपने लेआउट में ग्रिड का उपयोग कर रहे हैं, तो नियंत्रण दे शीर्ष पर रखा जाना करने के लिए MSDN से एक उच्च zindex
:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WindowTitle="ZIndex Sample">
<Canvas>
<Rectangle Canvas.ZIndex="3" Width="100" Height="100" Canvas.Top="100" Canvas.Left="100" Fill="blue"/>
<Rectangle Canvas.ZIndex="1" Width="100" Height="100" Canvas.Top="150" Canvas.Left="150" Fill="yellow"/>
<Rectangle Canvas.ZIndex="2" Width="100" Height="100" Canvas.Top="200" Canvas.Left="200" Fill="green"/>
<!-- Reverse the order to illustrate z-index property -->
<Rectangle Canvas.ZIndex="1" Width="100" Height="100" Canvas.Top="300" Canvas.Left="200" Fill="green"/>
<Rectangle Canvas.ZIndex="3" Width="100" Height="100" Canvas.Top="350" Canvas.Left="150" Fill="yellow"/>
<Rectangle Canvas.ZIndex="2" Width="100" Height="100" Canvas.Top="400" Canvas.Left="100" Fill="blue"/>
</Canvas>
</Page>
आप zindex, निर्दिष्ट नहीं करते हैं पैनल के बच्चे उन्हें निर्दिष्ट क्रम में प्रस्तुत किए जाते हैं (यानी शीर्ष पर अंतिम)।
यदि आप कुछ और जटिल करना चाहते हैं, तो आप देख सकते हैं कि चाइल्डविंडो को सिल्वरलाइट में कैसे कार्यान्वित किया जाता है। यह आपके संपूर्ण रूटविज़ुअल पर एक सेमिट्रेंटेंट पृष्ठभूमि और पॉपअप ओवरले करता है।
ग्रिड के उसी सेल में नियंत्रण बैक-टू-फ्रंट प्रदान किए जाते हैं। तो दूसरे के ऊपर एक नियंत्रण डालने का एक आसान तरीका यह है कि इसे उसी सेल में रखा जाए।
यहां एक उपयोगी उदाहरण है, जो एक पैनल को पॉप अप करता है जो एक व्यस्त संदेश के साथ दृश्य (यानी उपयोगकर्ता नियंत्रण) में सब कुछ अक्षम करता है, जबकि लंबे समय से चलने वाले कार्य को निष्पादित किया जाता है (यानी BusyMessage
बाध्य संपत्ति शून्य नहीं है) :
<Grid>
<local:MyUserControl DataContext="{Binding}"/>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility"
Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding BusyMessage}"
Value="{x:Null}">
<Setter Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Border HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="DarkGray"
Opacity=".7" />
<Border HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="White"
Padding="20"
BorderBrush="Orange"
BorderThickness="4">
<TextBlock Text="{Binding BusyMessage}" />
</Border>
</Grid>
</Grid>
यह डब्ल्यूपीएफ में Adorners का एक आम कार्य है। आमतौर पर एडॉर्नर्स अन्य सभी नियंत्रणों से ऊपर दिखाई देते हैं, लेकिन अन्य उत्तरों जो ज़ेड-ऑर्डर का उल्लेख करते हैं, आपके मामले को बेहतर तरीके से फिट कर सकते हैं।
Robert Rossney का एक अच्छा समाधान है। यहां एक वैकल्पिक समाधान है जिसका मैंने अतीत में उपयोग किया है जो शेष सामग्री से "ओवरले" को अलग करता है। यह समाधान अन्य सभी चीज़ों के शीर्ष पर "ओवरले" रखने के लिए संलग्न संपत्ति Panel.ZIndex
का लाभ उठाता है। आप या तो कोड में "ओवरले" की दृश्यता सेट कर सकते हैं या DataTrigger
का उपयोग कर सकते हैं।
<Grid x:Name="LayoutRoot">
<Grid x:Name="Overlay" Panel.ZIndex="1000" Visibility="Collapsed">
<Grid.Background>
<SolidColorBrush Color="Black" Opacity=".5"/>
</Grid.Background>
<!-- Add controls as needed -->
</Grid>
<!-- Use whatever layout you need -->
<ContentControl x:Name="MainContent" />
</Grid>
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>
नियंत्रण आप अपने XAML कोड के अंत में सामने लाने के लिए रखें। अर्थात।
<Grid>
<TabControl ...>
</TabControl>
<Button Content="ALways on top of TabControl Button"/>
</Grid>
काम करता है! लेकिन मैं स्थिति को सही करने के लिए ओवरले ग्रिड कैसे ले जा सकता हूं? –
यह ओवरले पूरी विंडो को कवर करेगा, केवल एक विशिष्ट क्षेत्र नहीं। –
अब तक का सबसे अच्छा समाधान! धन्यवाद! –