2013-05-17 11 views
11

के साथ उपयोग किया जाता है, मैं WindowChrome कक्षा System.Windows.Shell लाइब्रेरी (v 3.5.41019.1) में देख रहा था।विंडो टेम्पलेट में सीमा मार्जिन का कोई प्रभाव नहीं पड़ता है जब विंडो क्रोम

<Window x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell" 
     Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}"> 
    <Window.Resources> 
     <Style x:Key="WindowStyle1" TargetType="{x:Type Window}"> 
<!-- Here is the WindowChrome.--> 
      <Setter Property="shell:WindowChrome.WindowChrome"> 
       <Setter.Value> 
        <shell:WindowChrome /> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Window}"> 
<!-- And here is the Border. Its margin has no effect as far as I can tell.--> 
         <Border Margin="25" Background="Red"> 
          <AdornerDecorator> 
           <ContentPresenter/> 
          </AdornerDecorator> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 

    </Grid> 
</Window> 

आपको क्या लगता है कि के लिए कारण है: जब मैं एक Window खाका बनाने के लिए प्रयास करते हैं, टेम्पलेट में Border तत्व के मार्जिन पर कोई असर नहीं रहा है? मुझे लगता है कि सोच रहा हूँ, क्योंकि मैंने देखा है कि कुछ लोगों को * की तरह कुछ का उपयोग करें:

<Border x:Name="WindowBorder" Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}" Background="Red"> 

लेकिन के रूप में यह मेरी परीक्षणों में कोई असर नहीं होता है, क्या ऐसा करने का बिंदु हो सकता है?

(*) पर ModernUI प्रोजेक्ट का उपयोग किया जाने वाला स्थान है।

संपादित करें: मैंने विंडोज 7 पर एरो के साथ इसका परीक्षण किया है।

संपादित करें 2: यह अभी भी एयरो के साथ समान है।

उत्तर

7

MSDN के अनुसार, WindowChrome

एक वस्तु है कि एक खिड़की के गैर क्लाइंट क्षेत्र के लिए अनुकूलन का वर्णन करता है का प्रतिनिधित्व करता है।

MSDN नमूना पढ़ने और अपने कोड थोड़ी देर खेलने के बाद, मैंने देखा है अपने कोड MSDN नमूना कोड से निम्नलिखित की तरह होना चाहिए:

<Style x:Key="StandardStyle" TargetType="{x:Type local:MainWindow}"> 
<Setter Property="shell:WindowChrome.WindowChrome"> 
    <Setter.Value> 
     <shell:WindowChrome /> 
    </Setter.Value> 
</Setter> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:MainWindow}"> 
      <!--Note there is a Grid as the root--> 
      <Grid> 
       <Border Background="White" 
         Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}"> 
        <ContentPresenter Content="{TemplateBinding Content}" /> 
       </Border> 
       <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
          VerticalAlignment="Top" HorizontalAlignment="Left" 
          Margin="36,8,0,0"/> 
       <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}" 
         VerticalAlignment="Top" HorizontalAlignment="Left" 
         Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}" 
         Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}" 
         shell:WindowChrome.IsHitTestVisibleInChrome="True"/> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

ध्यान दें, वहाँ मूल तत्व के रूप में एक ग्रिड है जिसमें विंडो के एनसी को अनुकूलित करने के लिए कुछ तत्व शामिल हैं।

अद्यतन:

आप MSDN पेज के टिप्पणी में देख सकते हैं, इसमें वर्गों:

WindowStyle.None

WindowChrome

ये रूप को कस्टमाइज़ करने के दो तरीके हैं एक डब्ल्यूपीएफ आवेदन खिड़की के।

हालांकि, WindowStyle.None को Window.WindowStyle संपत्ति की स्थापना:

इस विंडो से गैर ग्राहक फ्रेम दूर करता है और केवल ग्राहक क्षेत्र छोड़ देता है, आप एक कस्टम शैली लागू कर सकता है। हालांकि, जब गैर-क्लाइंट फ्रेम हटा दिया जाता है, तो आप सिस्टम सुविधाओं और व्यवहार भी खो देते हैं, जैसे कैप्शन बटन और विंडो आकार बदलना। एक और दुष्प्रभाव यह है कि खिड़की विंडोज़ टास्कबार को अधिकतम होने पर कवर करेगी।

फिर WindowChrome WPF का उपयोग कर एनसी अनुकूलन सक्षम करने के लिए शुरू की है: जबकि इसके मानक कार्यक्षमता को बनाए रखना

एक खिड़की को अनुकूलित करने के लिए आपको WindowChrome वर्ग का उपयोग कर सकते हैं। विंडो क्रोम क्लास दृश्यों से विंडो फ्रेम की कार्यक्षमता को अलग करता है, और आपको आपके एप्लिकेशन विंडो के क्लाइंट और गैर-क्लाइंट क्षेत्रों के बीच की सीमा को नियंत्रित करने देता है। विंडो क्रोम क्लास आपको गैर-क्लाइंट क्षेत्र को कवर करने के लिए क्लाइंट क्षेत्र को विस्तारित करके विंडो फ्रेम को में WPF सामग्री डालने देता है। साथ ही, यह दो अदृश्य क्षेत्रों के माध्यम से सिस्टम व्यवहार को बरकरार रखता है; आकार बदलें और कैप्शन क्षेत्रों का आकार बदलें।

तो आपके प्रश्न पर वापस, आपके द्वारा प्राप्त टेम्पलेट को एमएसडीएन नमूना कोड से कॉपी किया जाना चाहिए, लेकिन वास्तविक रूट Grid को याद किया जाना चाहिए। सीमा पर मार्जिन एनसी को कुछ जगह देने के लिए है। एमएसडीएन नमूना कोड में, ContenPreseter में केवल क्लाइंट क्षेत्र होता है, जबकि एनसी में Border, विंडो शीर्षक के लिए TextBlock और विंडो आइकन के लिए Image शामिल है।

रीपैप करने के लिए, WindowChrome सेटिंग Window.Template में विंडो के एनसी क्षेत्र को अनुकूलित करने में सक्षम बनाता है।

नोट: नमूना MSDN नमूना कोड नेट 4.5 इन पुराना हो चुका एक छोटे से लगता है, System.Windows.Shell.WindowChromePresentationFramework.dll में है, इसलिए कोड की तरह लग रहे हो सकता है:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}" Icon="Icon1.ico"> 
<Window.Resources> 
    <Style x:Key="WindowStyle1" TargetType="{x:Type Window}"> 
     <Setter Property="WindowChrome.WindowChrome"> 
      <Setter.Value> 
       <WindowChrome /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Window}"> 
        <Grid> 
         <Border Background="Red" 
         Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}"> 
          <ContentPresenter Content="{TemplateBinding Content}" /> 
         </Border> 
         <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
          VerticalAlignment="Top" HorizontalAlignment="Left" 
          Margin="36,8,0,0"/> 
         <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}" 
         VerticalAlignment="Top" HorizontalAlignment="Left" 
         Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowChrome.WindowChrome.ResizeBorderThickness}" 
         Width="{Binding Source={x:Static SystemParameters.SmallIconWidth}}" 
         WindowChrome.IsHitTestVisibleInChrome="True"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Button /> 
</Grid> 

+0

आप सही हैं मुझे विश्वास है। उन्होंने एमएसडीएन से कोड की प्रतिलिपि बनाई, और यह किसी भी तरह से इस तरह से रुक गया। – hattenn

1

मुझे लगता है कि जिस तरह से आप सीमा निर्धारित करने की कोशिश कर रहे हैं उसमें कुछ गलतफहमी है। यहाँ WindowChrome कक्षा की व्याख्या के रूप में msdn

में प्रदान की WindowChrome वर्ग दृश्यों से खिड़की के फ्रेम की कार्यक्षमता को अलग करती है, और आप अपने अनुप्रयोग विंडो के ग्राहक और गैर ग्राहक क्षेत्रों के बीच की सीमा को नियंत्रित करने देता है। विंडो क्रोम क्लास आपको गैर-क्लाइंट क्षेत्र को कवर करने के लिए क्लाइंट क्षेत्र को विस्तारित करके विंडो फ्रेम में WPF सामग्री डाल देता है। साथ ही, यह दो अदृश्य क्षेत्रों के माध्यम से सिस्टम व्यवहार को बरकरार रखता है; आकार बदलें और कैप्शन क्षेत्रों का आकार बदलें।

तो यदि आप विंडो के गैर-क्लाइंट क्षेत्र को कस्टमाइज़ करने का प्रयास कर रहे हैं, तो यह सामग्री प्रस्तुतकर्ता नहीं है जिसे आपको सीमा पर सेट करना चाहिए। वह ग्राहक क्षेत्र है। इसके बजाय टेम्पलेट में आप अपने गैर-क्लाइंट क्षेत्र को परिभाषित करने के लिए सामग्री प्रेजेंटर के अलावा अपना एक्सएएमएल जोड़ सकते हैं। मैंने अभी आपके कोड के आधार पर एक साधारण कोड की कोशिश की है और यह विंडो के शीर्षक संपत्ति विंडो के दाईं ओर दाईं ओर बदलता है। यहां कोड है।

<Window x:Class="WPF_ToggleButton.ShellWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell" 
    Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}" 
    > 

<Window.Resources> 
    <Style x:Key="WindowStyle1" TargetType="{x:Type Window}"> 
     <Setter Property="shell:WindowChrome.WindowChrome"> 
      <Setter.Value> 
       <shell:WindowChrome /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Window}"> 
        <Grid> 
         <Border Background="Yellow"> 
          <AdornerDecorator> 
           <ContentPresenter Content="{TemplateBinding Content}"/> 
          </AdornerDecorator> 
         </Border> 
         <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
          VerticalAlignment="Top" HorizontalAlignment="Left" 
          Margin="100,0,0,0"/> 
        </Grid>       
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Border Margin="50" Background="AliceBlue"/> 
</Grid> 

इस प्रकार आप XAML कोड का उपयोग कर छवि अपने विंडो बंद करें बटन का प्रतिनिधित्व करने, आदि जैसे NonClient क्षेत्र में किसी भी तत्व हो सकता है। विंडो में अंतिम तत्व, को परिभाषित करता है ग्राहक क्षेत्र जो खाका

में सामग्री प्रस्तुतकर्ता को पारित कर दिया है संक्षेप में यदि आप अनुकूलित करने के लिए ग्राहकों का क्षेत्र सामग्री प्रस्तुतकर्ता का उपयोग wan't जबकि अगर आप को बदलने में रुचि रखते हैं गैर-क्लाइंट एरिया जैसे शीर्षक बार डिस्प्ले, करीबी छवि आइकन, फिर आप इसे टेम्पलेट में परिभाषित करते हैं।

एक छोटा अवलोकन। मुझे लगता है कि मार्जिन खिड़की के लिए कोई समझ नहीं लेता है। इसे सामान्य विंडो के लिए सेट करने का प्रयास करें और मुझे लगता है कि यह इसका सम्मान नहीं करेगा।

+0

सबसे पहले, देर से टिप्पणी करने के लिए क्षमा चाहते हैं। मैं पिछले कुछ दिनों में वास्तव में व्यस्त रहा हूं। मुझे पता है कि 'विंडो क्रोम' का उपयोग कैसे करें। समस्या यह है कि, जब आप 'WindowChrome' का उपयोग करते हैं और टेम्पलेट को परिभाषित करते हैं, तो' ControlTemplate' में पहले 'लेआउट' तत्व की' मार्जिन' प्रॉपर्टी का कोई प्रभाव नहीं पड़ता है। आपके कोड में एक ही चीज़ है। 'मार्जिन' को अपने' ग्रिड '(' ControlTemplate' में पहला) डालने का प्रयास करें और इसका कोई प्रभाव नहीं पड़ता है। यदि आप 'विंडो क्रोम' को हटाते हैं, तो आप देख सकते हैं कि 'मार्जिन' सामान्य 'विंडो' पर काले रंग से भरा हुआ है। – hattenn

+0

बात यह है कि, मैं 'मॉडर्नयूआई' पर एक नज़र डाल रहा था और देखा कि उन्होंने अपने 'विंडो' के 'कंट्रोल टेम्पलेट' में पहले 'लेआउट' तत्व के चारों ओर 'मार्जिन' रखा था (और फिर मैंने कुछ चीज़ों में एक ही चीज़ देखी अन्य स्थानों पर भी, मैं अनुमान लगा रहा हूं कि वे सभी एक ही स्थान से कॉपी-पेस्ट किए गए हैं।) लेकिन यह मेरे लिए कुछ भी नहीं बदला। मैं सोच रहा था क्योंकि शायद कुछ ऐसा नहीं है जो मुझे नहीं पता, शायद यह विंडोज एक्सपी, या विंडोज 8 पर काम करता है। मैं बस उस पर कुछ स्पष्टीकरण चाहता था। – hattenn

+0

मैं वास्तव में आपकी टिप्पणी पूरी तरह से समझ नहीं पा रहा हूं और इसके लिए मुझे खेद है। आप नियंत्रण टेम्पलेट में ग्रिड को मार्जिन सेट नहीं करना चाहते हैं। वह मार्जिन किस तत्व से संबंधित होगा? मेरा मतलब है उदाहरण के लिए, किस तत्व से 100 का मार्जिन? – Jatin

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