यह कहना मुश्किल है कि सर्वोत्तम अभ्यास इस मामले में है, लेकिन यहां यह है कि मैं इसे कैसे करूँगा।
अपने स्क्रीनशॉट में जादूगर नियंत्रण एक ItemsControl
और इस मामले में यह मेरे लिए आसान लगता है ItemsControl
से निकाले जाते हैं और प्रगति कार्यक्षमता तो दूसरी तरह के आसपास लागू करने के लिए लेकिन यह भी आप कैसे पर निर्भर करता है एक ProgressBar
का एक संयोजन और की तरह दिखता है इसे पर काम करना चाहते हैं (यदि आप एक चिकनी प्रगति चाहते हैं या उदाहरण के लिए डॉट्स को एक-एक करके जलाएं)।
का उपयोग कर एक UniformGrid
ItemsPanel
के रूप में और नीचे ItemTemplate
, हम निम्नलिखित नज़र प्राप्त एक DropShadowEffect
को ItemsPanel
, दो Path
के तत्वों को जोड़ने
<ItemsControl ItemsSource="{Binding Steps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Ellipse HorizontalAlignment="Center" Height="20" Width="20" Stroke="Transparent" Fill="Blue"/>
<TextBlock Grid.Row="1" Text="{Binding}" HorizontalAlignment="Center" Margin="0,5,0,0"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
(कदम तार का एक List
है) ItemTemplate
और दो DataTriggers
यह निर्धारित करने के लिए कि वर्तमान आइटम बाएं/दाएंको दिखाने/छिपाने के लिए पहली या आखिरी वस्तु है या नहींऔर हम अपने स्क्रीनशॉट के लिए एक बहुत समान दृष्टिकोण प्राप्त कर सकते
ItemsPanel
<UniformGrid Rows="1" SnapsToDevicePixels="True">
<UniformGrid.Effect>
<DropShadowEffect Color="Black"
BlurRadius="5"
Opacity="0.6"
ShadowDepth="0"/>
</UniformGrid.Effect>
</UniformGrid>
ItemTemplate
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="Path">
<Setter Property="Data" Value="M0.0,0.0 L0.0,0.33 L1.0,0.33 L1.0,0.66 L0.0,0.66 L0.0,1.0"/>
<Setter Property="StrokeThickness" Value="0"/>
<Setter Property="Height" Value="21"/>
<Setter Property="Stretch" Value="Fill"/>
<Setter Property="Fill" Value="{StaticResource wizardBarBrush}"/>
<Setter Property="StrokeEndLineCap" Value="Square"/>
<Setter Property="StrokeStartLineCap" Value="Square"/>
<Setter Property="Stroke" Value="Transparent"/>
</Style>
</DataTemplate.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Path Name="leftPath"/>
<Path Name="rightPath" Grid.Column="1"/>
<Ellipse Grid.ColumnSpan="2" HorizontalAlignment="Center" Height="20" Width="20" Stroke="Transparent" Fill="{StaticResource wizardBarBrush}"/>
<TextBlock Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding}" HorizontalAlignment="Center" Margin="0,5,0,0"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}"
Value="{x:Null}">
<Setter TargetName="leftPath" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={markup:IsLastItemConverter}}"
Value="True">
<Setter TargetName="rightPath" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
आप इस दृष्टिकोण आप शायद कसरत कर सकते हैं उपयोग करना चाहते हैं इसे बाकी कैसे प्राप्त करें, जैसे
- एक Resuable कस्टम नियंत्रण में इस लागू
- केवल प्रगति-भाग पर स्ट्रोक (
DropShadowEffect
) और नहीं पाठ में
- वैसे भी प्रगति कार्यक्षमता आदि
लागू मिलता है, मैं एक कस्टम नियंत्रण के साथ एक नमूना परियोजना WizardProgressBar
बुलाया अपलोड की गई और एक डेमो परियोजना यहां उसका उपयोग करना: https://www.dropbox.com/s/ng9vfi6uwn1peot/WizardProgressBarDemo2.zip?dl=0
यह इस
तरह लग रहा है
हालात नमूना
- मैं एक स्थिति में समाप्त हो गया है, जहां मैं प्रगति-भाग पर
DropShadowEffect
और हेडर मिलता है या (के रूप में के रूप में देखा प्रत्येक आइटम के बीच एक पतली रेखा मिलेगा के बारे में नोट करने के लिए चित्र)। मैं इससे छुटकारा पाने का एक आसान तरीका नहीं सोच सकता, इसलिए शायद यह सब के बाद सबसे अच्छा तरीका नहीं है :)
- प्रगति-भाग सरल है। यह सिर्फ 0-100 के बीच एक मान है और फिर एक कनवर्टर तय करता है कि आइटम को जलाया जाना चाहिए या नहीं
- इस नियंत्रण का एक छोटा प्रदर्शन प्रभाव हो सकता है लेकिन मुझे यकीन नहीं है क्योंकि मेरा कंप्यूटर आज सब कुछ धीमा चल रहा है ..
अद्यतन
नमूना परियोजना जहाँ मैं दो ItemsControls
में प्रस्तुति splitted प्रत्येक आइटम के बीच पतली लाइनों से छुटकारा पाने के लिए कुछ बदलाव किए हैं।अब ऐसा लगता है कि इस
इसे यहाँ अपलोड किया गया: अद्यतन
की https://www.dropbox.com/s/ng9vfi6uwn1peot/WizardProgressBarDemo2.zip?dl=0
समाप्ति और यहाँ नमूना कोड से लापता भागों के ऊपर
<LinearGradientBrush x:Key="wizardBarBrush" StartPoint="0.5,0.0" EndPoint="0.5,1.0">
<GradientStop Color="#FFE4E4E4" Offset="0.25"/>
<GradientStop Color="#FFededed" Offset="0.50"/>
<GradientStop Color="#FFFCFCFC" Offset="0.75"/>
</LinearGradientBrush>
IsLastItemConverter
हैं public class IsLastItemConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ContentPresenter contentPresenter = value as ContentPresenter;
ItemsControl itemsControl = ItemsControl.ItemsControlFromItemContainer(contentPresenter);
int index = itemsControl.ItemContainerGenerator.IndexFromContainer(contentPresenter);
return (index == (itemsControl.Items.Count - 1));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
public IsLastItemConverter() { }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
मुझे नहीं लगता कि अभी इस तरह कुछ भी है। मुझे लगता है कि आप लेबल्स और प्रतिशत के गतिशील गति के लिए चाहते हैं? – Stimul8d
पसंदीदा रूप से। मैं लेबल की 'आइटम नियंत्रण' (या अन्य सूची) में ड्रॉप करने में सक्षम होना चाहता हूं और वर्तमान चरण या अनुक्रमणिका का चयन करना चाहता हूं, लेकिन मैं अन्य विकल्पों के लिए खुला हूं। –