Вложение индикатора прогресса в комбинированный список в WPF - PullRequest
1 голос
/ 04 июля 2010

Можно ли вкладывать индикатор прогресса в комбинированный список или наоборот?Я хочу иметь возможность ввести в поле со списком и нажать кнопку, и индикатор выполнения показывает ход события, как в Windows Explorer.

РЕДАКТИРОВАТЬ: мне нужен код в Visual Basic.NET 3.5 Спасибо.

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Вот один из способов сделать это, в основном то, что я сделал:

  1. Подкласс ComboBox и добавление свойств зависимостей IsProgressVisible и ProgressValue
  2. Добавление зеленого прямоугольника в элемент управления ComboBoxшаблон точно за редактируемой областью
  3. Привязать видимость прямоугольника к IsProgressVisible и ширину прямоугольника (используя ScaleTransform) к ProgressValue

Сначала новый код управления:

public class ProgressCombo : ComboBox
{
    public static readonly DependencyProperty IsProgressVisibleProperty =
        DependencyProperty.Register("IsProgressVisible", typeof(bool), typeof(ProgressCombo));
    public bool IsProgressVisible
    {
        get { return (bool)GetValue(IsProgressVisibleProperty); }
        set { SetValue(IsProgressVisibleProperty, value); }
    }
    public static readonly DependencyProperty ProgressValueProperty =
        DependencyProperty.Register("ProgressValue", typeof(double), typeof(ProgressCombo));
    public double ProgressValue
    {
        get { return (double)GetValue(ProgressValueProperty); }
        set { SetValue(ProgressValueProperty, value); }
    }        
}

Также есть конвертер значений, который мы будем использовать:

public class FromPercentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((double)value) / 100;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Теперь возьмем образец стиля комбинированного блока из MSDN (версия .net 3.5, а не 4) из http://msdn.microsoft.com/en-us/library/ms750638%28VS.90%29.aspx

Добавьте определение xmlns:l к вашей собственной сборке

Теперь измените <Style x:Key="{x:Type ComboBox}" TargetType="ComboBox"> на <Style x:Key="{x:Type l:ProgressCombo}" TargetType="l:ProgressCombo">

Измените <ControlTemplate TargetType="l:ComboBox"> На:

<ControlTemplate TargetType="l:ProgressCombo">
    <ControlTemplate.Resources>
        <BooleanToVisibilityConverter x:Key="Bool2Vis"/>
        <l:FromPercentConverter x:Key="FromPercent"/>
    </ControlTemplate.Resources>

Найдите строку <ContentPresenter и добавьте перед ним:

<Rectangle 
    Fill="LightGreen"
    Margin="3,3,23,3"
    Visibility="{TemplateBinding IsProgressVisible, Converter={StaticResource Bool2Vis}}">
    <Rectangle.RenderTransform>
        <ScaleTransform ScaleX="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ProgressValue, Converter={StaticResource FromPercent}}"/>
    </Rectangle.RenderTransform>
</Rectangle>

И это все

0 голосов
/ 04 июля 2010

У меня было похожее требование по другой причине (у меня было комбо, которое автоматически заполнялось после сканирования сети).Посмотрите, поможет ли вам этот вопрос и ответ: WPF ComboBox - показывает что-то другое, когда нет привязанных элементов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...