में गतिशील प्रतिशत-आधारित चौड़ाई शायद आप इसे समझने में मेरी सहायता कर सकते हैं: मेरे पास एक शब्दकोश और एक आइटम नियंत्रण है जो उस शब्दकोश से जुड़ा हुआ है। प्रत्येक प्रविष्टि की कुंजी आइटम नियंत्रण में प्रत्येक आइटम की सामग्री निर्धारित करती है और मान प्रत्येक आइटम की चौड़ाई निर्धारित करता है। इसके साथ बड़ी समस्या: चौड़ाई प्रतिशत मान है, इसलिए यह मुझे बताती है कि, उदाहरण के लिए, मेरे आइटम को आकार में अपने माता-पिता का 20% होना चाहिए।WPF
मैं इसे कैसे प्राप्त कर सकता हूं? मुझे पता है कि ग्रिड स्टार-आधारित चौड़ाई के साथ काम करने में सक्षम हैं, लेकिन चूंकि मुझे ग्रिड की शुरुआत में ग्रिडडिफिनिशन को परिभाषित करना है, इसलिए मैं इसे आइटम्स कंट्रोल.इटम टेम्पलेट में नहीं कर सकता।
वर्तमान कोड:
<ItemsControl ItemsSource="{Binding Distribution}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid IsItemsHost="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- I NEED THIS TO BE A CERTAIN PERCENTAGE IN WIDTH -->
<Label Content="{Binding Key.Text}" Foreground="{Binding Key.Color}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
इस पर कोई भी विचार? क्या इसे हल करने का कोई शानदार तरीका है?
धन्यवाद!
स्पष्टीकरण: प्रतिशत आइटमकंट्रोल माता-पिता पर आधारित होना चाहिए!
और दूसरा एक: प्रत्येक आइटम को ग्रिड का एक स्तंभ होना चाहिए, न कि पंक्ति। तो मुझे एक ही पंक्ति में एक दूसरे के बगल में रहने के लिए सभी वस्तुओं की आवश्यकता है।
समाधान:
आपकी मदद के लिए धन्यवाद, इस समस्या को Multibinding का उपयोग करने और ItemsControl की ActualWidth लिए बाध्यकारी द्वारा हल किया जा सकता है। इस तरह, जब भी आइटम नियंत्रण आकार में बदल जाता है, आइटम भी बदल जाते हैं। एक ग्रिड की जरूरत नहीं है। यह समाधान केवल एक सापेक्ष चौड़ाई बनाता है, लेकिन वही समाधान निश्चित रूप से वस्तुओं की ऊंचाई पर लागू किया जा सकता है।
XAML:: यह एक लघु संस्करण, एक और अधिक विस्तृत विवरण के लिए नीचे देख रहा है
<ItemsControl ItemsSource="{Binding Distribution}" Name="itemsControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Key.Text}"
Foreground="{Binding Key.Color}">
<Label.Width>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="Value"/>
<Binding Path="ActualWidth" ElementName="itemsControl"/>
</MultiBinding>
</Label.Width>
</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
कनवर्टर:
class MyConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
//[1] contains the ItemsControl.ActualWidth we binded to, [0] the percentage
//In this case, I assume the percentage is a double between 0 and 1
return (double)value[1] * (double)value[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
और वह चाल करना चाहिए!
क्या माता-पिता का 20%? आइटम्स कंट्रोल, लेबल, या कुछ और के माता-पिता? – jtimperley
क्या मतलब है "मुझे ग्रिड की शुरुआत में ग्रिडडिफिनिशन को परिभाषित करना है?" आप अपने ग्रिड को 'DataTemplate' में इसके बजाय परिभाषित कर सकते हैं - इसे' आइटम पैनेल टेम्पलेट 'में होने की आवश्यकता नहीं है। –
हाय। मेरा संपादन देखें, 20% आइटमकंट्रोल माता-पिता (या लेबल अभिभावक का 20% होना चाहिए। चूंकि मैं दोनों दिशाओं में लेबल्स पैरेंट स्ट्रेच कर सकता हूं) यह वही होगा। ग्रिड की शुरुआत के लिए: हाँ, मैं अपने ग्रिड को डेटा टेम्पलेट में परिभाषित कर सकता हूं, लेकिन फिर प्रत्येक आइटम का अपना ग्रिड होगा, जो काम नहीं करेगा, या मैं यहां कुछ देख रहा हूं? – BlackWolf