2012-12-23 16 views
6

एक वेबसाइट को मीडिया प्रश्नों का उपयोग करके छोटे स्क्रीन आकारों को अनुकूलित करने के लिए डिज़ाइन किया जा सकता है। उदाहरण के लिए, एक विस्तृत स्क्रीन पर तीन कॉलम, कम-रिज़ॉल्यूशन फोन पर एक कॉलम।मैं WPF में अनुकूली लेआउट कैसे बना सकता हूं?

क्या उपलब्ध स्क्रीन स्पेस या अभिभावक नियंत्रण आकार के आधार पर लेआउट समायोजित करने के लिए WPF के लिए एक समान तकनीक है?

उदाहरण के लिए, मैं एक बड़ी स्क्रीन पर क्षैतिज रूप से प्रदर्शित 3 कॉलम रखना चाहता हूं, लेकिन छोटी स्क्रीन पर लंबवत प्रदर्शित होता हूं। आदर्श रूप से, मैं इस तरह के लेआउट तैयार करना चाहता हूं: "यदि इस नियंत्रण की चौड़ाई 400 अंकों से कम है, तो इस तरह से इन नियंत्रणों को पुनर्व्यवस्थित करें।"

मैं WPF में इस तरह एक अनुकूली डिज़ाइन कैसे बना सकता हूं? यही है, विशिष्ट अभिभावक नियंत्रण आकार के लिए नियंत्रण के लिए विभिन्न लेआउट परिभाषित करें?

बेहद धीमी होने से बचने के लिए आदर्श नियंत्रण को डुप्लीकेट या पुनर्निर्मित करने के बजाय पुन: व्यवस्थित किया जाना चाहिए।

+0

तुम अकेले XAML का उपयोग कर मतलब है, या आप कोड में यह करने के लिए एक तरह से तलाश कर रहे हैं? – Zipper

+0

@ ज़ीपर बेशक, मैं एक्सएएमएल में यह घोषणा करना पसंद करूंगा। यदि यह तुरंत संभव नहीं है, तो मुझे कुछ ढांचे कोड लिखने पर कोई फर्क नहीं पड़ता। लेकिन अंत में, मैं बिना किसी प्रक्रियात्मक कोड के लेआउट का वर्णन करना चाहता हूं। – Athari

उत्तर

14

यह करने के लिए सबसे आसान तरीका है, तो बाध्य मूल्य अधिक से अधिक या एक पैरामीटर से भी कम है परीक्षण करने के लिए DataTriggers और एक Converter के साथ है।

यह आपको बाध्य मूल्य के आधार पर शैली सेटर्स को आसानी से समायोजित करने की अनुमति देगा। उदाहरण के लिए, आप इस्तेमाल कर सकते हैं

<Style x:Key="MyControlStyle"> 
    <!-- Default Values --> 
    <Setter Property="Grid.Row" Value="0" /> 
    <Setter Property="Grid.Column" Value="0" /> 
    <Style.Triggers> 
     <DataTrigger Value="True" 
        Binding="{Binding ActualHeight, ElementName=MyWindow, 
         Converter={StaticResource IsValueLessThanParameter}, 
         ConverterParameter=400}"> 
      <!-- Values to use when Trigger condition is met --> 
      <Setter Property="Grid.Row" Value="1" /> 
      <Setter Property="Grid.Column" Value="1" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

मामले में जहां आपको लगता है कि कुछ ट्रिगर मूल्य के आधार पर बदल कई टुकड़ों के साथ एक अधिक जटिल लेआउट में, आप के बजाय सिर्फ अलग-अलग प्रॉपर्टी आपके ट्रिगर के साथ पूरे टेम्पलेट्स की जगह ले सकता

<Style x:Key="MyContentControlStyle" TargetType="{x:Type ContentControl}"> 
    <Setter Property="ContentTemplate" Value="{StaticResource BigTemplate}" /> 
    <Style.Triggers> 
     <DataTrigger Value="True" 
        Binding="{Binding ActualHeight, ElementName=MyWindow, 
         Converter={StaticResource IsValueLessThanParameter}, 
         ConverterParameter=400}"> 
      <Setter Property="ContentTemplate" Value="{StaticResource LittleTemplate}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

मेरा मानना ​​है कि आप अपने बाइंडिंग में एप्लिकेशन के बारे में अतिरिक्त जानकारी का उपयोग करने के लिए SystemParameters ऑब्जेक्ट से भी जुड़ सकते हैं, हालांकि मुझे अभी इसके लिए सटीक वाक्यविन्यास याद नहीं है।

1

मुझे ऐसा कुछ करने का एकमात्र तरीका कोड में है, और आपको कस्टम लेआउट बनाना होगा। ऐसा करने का सबसे आसान तरीका पैनल से विरासत में प्राप्त एक नई कक्षा बनाना है, और MeasureOverride और ArrangeOverride को कार्यान्वित करना है। मैंने पहले कस्टम लेआउट किए हैं, और वे सभी मामलों के लिए काम करने के लिए एक बड़ा दर्द होने का अंत कर सकते हैं। यदि आप Google "wpf कस्टम लेआउट" के साथ शुरू करने के लिए कुछ अच्छे उदाहरण प्राप्त करेंगे। आप जो भी कार्यक्षमता चाहते हैं उसे देखते हुए, आप निश्चित रूप से अपने काम काट लेंगे। आप अपने कोड को विभिन्न आकारों में क्या शामिल किया जाना चाहिए इसका एक विचार देने के लिए xaml में एनोटेशन डालने के बारे में देखने के लिए संलग्न गुणों को देखना चाहेंगे।

+0

यह वास्तव में आसानी से 'डेटाट्रिगर्स' के साथ किया जाता है जो लेआउट गुणों को बदलता है या संभवतः 'डेटा टेम्पलेट' को मूल नियंत्रण की 'वास्तविक विड्थ' और 'वास्तविक हाइट' संपत्ति के आधार पर भी बदलता है। आपको – Rachel

1

आप WPF के UWP स्वाद का उपयोग कर रहे हैं, तो आप AdaptiveTrigger उपयोग कर सकते हैं:

<AdaptiveTrigger MinWindowWidth="720" MinWindowHeight="900" /> 
+0

के लिए कोड में एक कस्टम लेआउट की आवश्यकता नहीं है यूडब्ल्यूपी और डब्ल्यूपीएफ को ध्यान में रखते हुए अधिकतर असंबंधित तकनीकें हैं, मैं कहूंगा कि "एक्सएएमएल जीयूआई का यूडब्ल्यूपी स्वाद" या ऐसा कुछ। :) मुझे आश्चर्य है कि ऐसा कुछ WPF के लिए मौजूद है या नहीं। शायद डेटा ट्रिगर subclassing काम कर सकता है। – Athari

+0

पर्याप्त मेला। वे इतने समान हैं कि आप यूडब्ल्यूपी में काफी उत्पादक हो सकते हैं, उन बिट्स को सीखना जिन्हें आप रास्ते में उपयोग नहीं कर सकते हैं। कभी-कभी आप नई चीजें खोजते हैं, जैसे मैंने आज 'एडैप्टिव ट्रिगर' के साथ किया था। –

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