none
Progressbar WPF RRS feed

  • Вопрос

  • Всем доброго времени суток, появилась идея отображать (проценты % ) в progressbar. Реализовал я это следующим путем : 

    <DataGridTemplateColumn Header="test" Width="150">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ProgressBar Value="{Binding res_v}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        
                    </DataGridTemplateColumn>

    Как отобразить в DataGrid я разобрался. Но появилась следующая идея, я хочу плавно изменять цвет progressbara в зависимости от его значения. Например:

    - Если  значение равно 100% (отображать зеленый цвет) 

    - Если значение равно 50%  (отображать оранжевый цвет)

    - И на конец если значение меньше 50% ( красный цвет)

    Но я хочу сделать  это  отображение смешиванием цветов... например если 65 % то (мы не получаем насыщенного оранжевого  а смешанный цвет зеленый + оранжевый) 

    Также и с красным медленно перерастающий из оранжевого в насыщенный красный. 

    И еще один главный вопрос, не могу найти как отображать цифры поверх progressbara, неужели придется сверху лепить lable что бы получить свои цифры ?

    Если есть у кого примеры поделитесь пожалуйста.

    Всем большое спасибо.  

    23 ноября 2015 г. 19:47

Ответы

  • В DataTemplate может быть только один элемент. Попробуйте обернуть в StackPanel:

    <DataTemplate>
    	<StackPanel>
    		<ProgressBar Name="pbStatus"/>
    		<TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
    	</StackPanel>
    </DataTemplate>

    • Помечено в качестве ответа Ethernets 25 ноября 2015 г. 15:19
    25 ноября 2015 г. 14:14

Все ответы

  • Вот тут посмотрите по поводу цвета.

    Тут текст в прогресс баре.

    23 ноября 2015 г. 20:36
  • По поводу текста получаю ошибку 

     <DataGridTemplateColumn Header="test" Width="150">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ProgressBar Name="pbStatus"/>
                                <TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        
                    </DataGridTemplateColumn>

    получаю ошибку: 

    - Свойство "VisualTree" может быть задано только один раз
    с цветом завтра попробую, спасибо большое. 

    P.s Пометку поставлю как вопрос будет, решен. Спасибо за ответ

    23 ноября 2015 г. 20:48
  • Всем доброго времени суток, столкнулся с такой проблемой, на моем рабочем проекте где я хочу применить progressbar отладчик останавливает мое приложение с ошибкой исключения : 

    Необработанное исключение типа "System.Windows.Markup.XamlParseException" в PresentationFramework.dll
    Дополнительные сведения: "Предоставление значения для "System.Windows.Baml2006.TypeConverterMarkupExtension" вызвало исключение.": номер строки "68" и позиция в строке "42".

    Я полагаю ошибка из за одного из конвертеров, но не пойму из за чего,  ниже приведу код xaml/C# :

    Конвертера:

     class Myconverter : MarkupExtension, IMultiValueConverter
        {
            public object Convert (object[] values, Type targetType, object parametr, CultureInfo culture)
            {
                var result = "-";
                double round = 0, round1 = 0;
                if (values[0] != null)
                {
                    round = Math.Round((float)values[0]);
                    round1 = Math.Round((float)values[1] / 1000);
                }
                if (values.Length == 2) {
    
                     result = string.Format("{0}/{1}", round, round1);   
                }
                return result;
    
            }
    
            public object[] ConvertBack(object values, Type[] targetType, object parametr, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return new Myconverter();
            }
        }
    
        //=====================================================================================================================
        class resursed : MarkupExtension, IValueConverter
         {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
           {
              var resul = "-";
             if (value is float)
              {
               var test = (float)value;
               if (test == 100)
               test = test / 100; 
               resul = string.Format("{0:P0}", test);
              }                 
             return resul;
           }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
          throw new NotImplementedException();
         }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
         {
          return new resursed();
         }
    
       }
    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid"
            x:Class="WpfApplication1.MainWindow"
            mc:Ignorable="d"
            x:Name="mainWindow"
           
            Title="Archive_new" Height="834" Width="627" Icon="positive.ico">
        <!--local:Myconverter x:key ="Myconverter" /-->
        <Window.CommandBindings>
            <CommandBinding Command="Open" Executed="CommandBinding_Open_Executed" />
            <CommandBinding Command="Save" Executed="CommandBinding_Save_Executed"/>
            <CommandBinding Command="Close" Executed="CommandBinding_Close_Executed"/>
        </Window.CommandBindings>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="25"/>
                <RowDefinition Height="292*"/>
            </Grid.RowDefinitions>
    
    
            <Menu>
                <MenuItem Header="File">
                    <MenuItem Header="Open" Command="Open"/>
                    <MenuItem Header="Save" Command="Save"/>
                    <MenuItem Header="Close" Command="Close" />
                </MenuItem>
            </Menu>
            <TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="728" Margin="0,41,-2,0" Grid.Row="1" VerticalAlignment="Top" Width="615" DataContext="{Binding}">
                <TabItem Header="TabItem">
                    <Grid Background="#FFE5E5E5"/>
                </TabItem>
                <TabItem Header="TabItem">
                    <Grid Background="#FFE5E5E5" Margin="0,-3,0,-11">
                        <DataGrid x:Name="Testik" Grid.Row="1" DataContext ="{Binding ElementName=mainWindow, Path=List}" ItemsSource="{Binding}" AutoGenerateColumns="False"   IsReadOnly="True" SelectionMode="Single" LoadingRow="Testik_LoadingRow" CanUserDeleteRows="False" CanUserAddRows="True" CanUserResizeRows="False" RowDetailsVisibilityMode="Visible" Margin="-2,2,-1,478" >
    
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="№" Binding="{Binding nk}" IsReadOnly="True"/>
                                <DataGridTemplateColumn Header="Дата\Время">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding t_n, StringFormat={}{0:dd/MM/yyyy HH:MM }}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                    <DataGridTemplateColumn.CellEditingTemplate>
                                        <DataTemplate>
                                            <DatePicker SelectedDate="{Binding t_n}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellEditingTemplate>
                                </DataGridTemplateColumn>
                                <DataGridTextColumn Header="Вес(т)/Длина">
                                    <DataGridTextColumn.Binding>
                                        <MultiBinding Converter="{local:Myconverter}">
                                            <Binding Path="P"/>
                                            <Binding Path ="L"/>
                                        </MultiBinding>
                                    </DataGridTextColumn.Binding>
                                </DataGridTextColumn>
                                <DataGridTextColumn Header="Ресурс" Binding="{Binding res_v, Converter={local:resursed}}" />
                                <DataGridTemplateColumn Header="Test" Width="20">
                                    <DataGridTemplateColumn.CellTemplate >
                                        <DataTemplate>
                                            <ProgressBar Value="res_v"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                                <DataGridTextColumn Header="Диаметр верхн.(мм)" Binding="{Binding d_vv, StringFormat=\{0:F2\}}" />
                                <DataGridTextColumn Header="Диаметр нижн.(мм)" Binding="{Binding d_vn, StringFormat=\{0:F2\}}" />
                                <DataGridTextColumn Header="Номер верхнего" Binding="{Binding N_vv}" />
                                <DataGridTextColumn Header="Номер нижнего" Binding="{Binding N_vn}" />
    
                                <DataGridTextColumn Binding="{Binding Pm}" />
                                <DataGridTextColumn Binding="{Binding Pp}" />
                                <DataGridTextColumn Binding="{Binding kal_n}" />
                                <DataGridTextColumn Binding="{Binding kal_v}" />
    
                               
    
                                <DataGridTextColumn Binding="{Binding Frez[0]}" />
                                <DataGridTextColumn Binding="{Binding Frez[1]}" />
                                <DataGridTextColumn Binding="{Binding Frez[2]}" />
                                <DataGridTextColumn Binding="{Binding Frez[3]}" />
    
                                <DataGridTextColumn Binding="{Binding Irez[0]}" />
                                <DataGridTextColumn Binding="{Binding Irez[1]}" />
                                <DataGridTextColumn Binding="{Binding Irez[2]}" />
                                <DataGridTextColumn Binding="{Binding Irez[3]}" />
                            </DataGrid.Columns>
    
    
                            <DataGrid.LayoutTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="90"/>
                                    <MatrixTransform Matrix="-1,0,0,1,0,0"/>
                                </TransformGroup>
                            </DataGrid.LayoutTransform>
                            <DataGrid.ColumnHeaderStyle>
                                <Style TargetType="{x:Type DataGridColumnHeader}"
    								BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                                    <Setter Property="LayoutTransform">
                                        <Setter.Value>
                                            <TransformGroup>
                                                <RotateTransform Angle="-90"/>
                                                <ScaleTransform ScaleX="1" ScaleY="-1" />
                                            </TransformGroup>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.ColumnHeaderStyle>
                            <DataGrid.CellStyle>
                                <Style  TargetType="{x:Type DataGridCell}">
                                    <Setter Property="LayoutTransform">
                                        <Setter.Value>
                                            <TransformGroup>
                                                <RotateTransform Angle="-90"/>
                                                <ScaleTransform ScaleX="1" ScaleY="-1" />
                                            </TransformGroup>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.CellStyle>
    
                        </DataGrid>
    
                        <DataGrid x:Name="dataGrid" Grid.Row="2" DataContext ="{Binding ElementName=mainWindow, Path=List1}" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="4,299,0,-183" VerticalAlignment="Top" Width="359" Height="594" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" CanUserDeleteRows="False" CanUserAddRows="False" CanUserResizeRows="False" RowDetailsVisibilityMode="Visible" RenderTransformOrigin="0.485,0.187">
                            <DataGrid.Columns>
                                
                                <DataGridTextColumn Binding="{Binding nk}" IsReadOnly="True"/>
                                <DataGridTextColumn Header="Nomber" Binding="{Binding N_vn}" />
                                <DataGridTextColumn Binding="{Binding N_vv}" />
                                <DataGridTextColumn Binding="{Binding d_vn, StringFormat=\{0:F2\}}" />
                                <DataGridTextColumn Binding="{Binding d_vv, StringFormat=\{0:F2\}}" />
    
                                <DataGridTemplateColumn Header="t_n">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding t_n}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                    <DataGridTemplateColumn.CellEditingTemplate>
                                        <DataTemplate>
                                            <DatePicker SelectedDate="{Binding t_n}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellEditingTemplate>
                                </DataGridTemplateColumn>
    
                                <DataGridTemplateColumn Header="t_k">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding t_k}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                    <DataGridTemplateColumn.CellEditingTemplate>
                                        <DataTemplate>
                                            <DatePicker SelectedDate="{Binding t_k}" />
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellEditingTemplate>
                                </DataGridTemplateColumn>
    
                                <DataGridTextColumn Binding="{Binding L}" />
                                <DataGridTextColumn Binding="{Binding P}" />
                                <DataGridTextColumn Binding="{Binding Pm}" />
                                <DataGridTextColumn Binding="{Binding Pp}" />
                                <DataGridTextColumn Binding="{Binding kal_n}" />
                                <DataGridTextColumn Binding="{Binding kal_v}" />
                                <DataGridTextColumn Binding="{Binding res_v}" />
    
                                <DataGridTextColumn Binding="{Binding Frez[0]}" />
                                <DataGridTextColumn Binding="{Binding Frez[1]}" />
                                <DataGridTextColumn Binding="{Binding Frez[2]}" />
                                <DataGridTextColumn Binding="{Binding Frez[3]}" />
    
                                <DataGridTextColumn Binding="{Binding Irez[0]}" />
                                <DataGridTextColumn Binding="{Binding Irez[1]}" />
                                <DataGridTextColumn Binding="{Binding Irez[2]}" />
                                <DataGridTextColumn Binding="{Binding Irez[3]}" />
                            </DataGrid.Columns>
                            <DataGrid.LayoutTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="90"/>
                                    <MatrixTransform Matrix="-1,0,0,1,0,0"/>
                                </TransformGroup>
                            </DataGrid.LayoutTransform>
                            <DataGrid.ColumnHeaderStyle>
                                <Style TargetType="{x:Type DataGridColumnHeader}"
    								BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                                    <Setter Property="LayoutTransform">
                                        <Setter.Value>
                                            <TransformGroup>
                                                <RotateTransform Angle="-90"/>
                                                <ScaleTransform ScaleX="1" ScaleY="-1" />
                                            </TransformGroup>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.ColumnHeaderStyle>
                            <DataGrid.CellStyle>
                                <Style  TargetType="{x:Type DataGridCell}">
                                    <Setter Property="LayoutTransform">
                                        <Setter.Value>
                                            <TransformGroup>
                                                <RotateTransform Angle="-90"/>
                                                <ScaleTransform ScaleX="1" ScaleY="-1" />
                                            </TransformGroup>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.CellStyle>
                        </DataGrid>
    
                    </Grid>
                </TabItem>
            </TabControl>
            <DatePicker HorizontalAlignment="Left" Margin="10,5,0,0" Grid.Row="1" VerticalAlignment="Top" Height="31" Width="102"/>
            <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="31" Margin="479,5,0,0" Grid.Row="1" VerticalAlignment="Top" Width="126"/>
    
            <xctk:DecimalUpDown HorizontalAlignment="Left" Margin="179,7,0,0" Grid.Row="1" VerticalAlignment="Top" Height="29"  Value="1" Increment="1" Maximum="3" Minimum="1"/>
            <Label x:Name="label" Content="Label" HorizontalAlignment="Left" Margin="352,23,0,0" Grid.Row="1" VerticalAlignment="Top"/>
            <Button x:Name="button" Content="OK" HorizontalAlignment="Left" Height="31" Margin="117,5,0,0" Grid.Row="1" VerticalAlignment="Top" Width="57"/>
    
        </Grid>
    </Window>
    


    помогите разобраться в чем причина, если закомент. строку 

      <ProgressBar Value="res_v"/>

    То ошибки исключения нет.

    Всем спасибо, если нужен весь код могу предоставить

    24 ноября 2015 г. 7:50
  • По поводу цветов, а нет другого решения данного вопроса ? 

    потому как я понял если мне нужно 8 прогрессбаров, мне нужно каждый прогресс отрисовывать вручную ? 

    24 ноября 2015 г. 12:00
  • Ошибка решена :

    Необработанное исключение типа "System.Windows.Markup.XamlParseException" в PresentationFramework.dll
    Дополнительные сведения: "Предоставление значения для "System.Windows.Baml2006.TypeConverterMarkupExtension" вызвало исключение.": номер строки "68" и позиция в строке "42".

    Пропустил привязку данных 

      <ProgressBar Value="{Binding res_v"}/>
    25 ноября 2015 г. 5:41
  • По поводу текста получаю ошибку 

     <DataGridTemplateColumn Header="test" Width="150">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ProgressBar Name="pbStatus"/>
                                <TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        
                    </DataGridTemplateColumn>

    получаю ошибку: 

    - Свойство "VisualTree" может быть задано только один раз
    с цветом завтра попробую, спасибо большое. 

    P.s Пометку поставлю как вопрос будет, решен. Спасибо за ответ

    Коллеги я все еще нуждаюсь в вашей помощи.
    25 ноября 2015 г. 12:24
  • В DataTemplate может быть только один элемент. Попробуйте обернуть в StackPanel:

    <DataTemplate>
    	<StackPanel>
    		<ProgressBar Name="pbStatus"/>
    		<TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />
    	</StackPanel>
    </DataTemplate>

    • Помечено в качестве ответа Ethernets 25 ноября 2015 г. 15:19
    25 ноября 2015 г. 14:14
  • Большое спасибо
    25 ноября 2015 г. 15:19
  • Всем доброго времени суток, хочу поделится двумя примерами которые помогут вам изменить цвет progressbar.

    Первый вариант использует чистый xlam:

    <ProgressBar  Name="pbStatus" Value="{Binding res_v}" Height="17" >
                                                    <ProgressBar.Foreground>
                                                        <LinearGradientBrush StartPoint="0,0" EndPoint="200,0" MappingMode="Absolute">
                                                            <GradientStop Color="Red" Offset="0" />
                                                            <GradientStop Color="Red" Offset="0.1" />
                                                            <GradientStop Color="Yellow" Offset="0.1" />
                                                            <GradientStop Color="Yellow" Offset="0.5" />
                                                            <GradientStop Color="Green" Offset="0.5" />
                                                            <GradientStop Color="Green" Offset="0.99" />
                                                            <GradientStop Color="Blue" Offset="0.99" />
                                                            <GradientStop Color="Blue" Offset="1" />
                                                        </LinearGradientBrush>
                                                    </ProgressBar.Foreground>
                                                </ProgressBar>

    Такое решение разделит ваш прогресс бар на 4-е сразу отображаемых цвета (красный, желтый, зеленый, синий) использовать можно и меньше цветов и больше  и т.д.

    Ну и второй вариант это конечно с использованием конвертера:

    <ProgressBar  Name="pbStatus" Value="{Binding res_v, Converter={local:resursed}}" Height="17" 
                                                              Foreground="{Binding RelativeSource={RelativeSource Self}, Path =Value, Converter={local:ValueToColorConverter}}" />

    public class ValueToColorConverter : MarkupExtension, IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value != null)
                {
                    var progress = (double)value;
                    if (progress < 30)
                        return new SolidColorBrush(Colors.Red);
                    else if (progress >= 30 && progress < 70)
                        return new SolidColorBrush(Colors.Yellow);
                    else
                        return new SolidColorBrush(Colors.Green);
                }
                return value;
                }
     
            
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return new ValueToColorConverter();
            }
        }

    Удачи в начинаниях



    • Изменено Ethernets 28 ноября 2015 г. 14:24
    28 ноября 2015 г. 14:11