将进度条嵌套到WPF中的Combobox中

时间:2010-07-03 23:54:10

标签: wpf xaml

是否可以将进度条嵌套到组合框中或以其他方式嵌套。我希望能够输入组合框并点击一个按钮,进度条显示事件的进度,就像在Windows资源管理器中一样。

编辑:我需要Visual Basic.NET 3.5中的代码谢谢。

2 个答案:

答案 0 :(得分:1)

这是一种方法,基本上我所做的是:

  1. Subclass ComboBox并添加IsProgressVisible和ProgressValue依赖属性
  2. 将ComboBox控件模板的绿色矩形正好添加到可编辑区域
  3. 后面
  4. 将矩形可见性绑定到IsProgressVisible,将矩形宽度(使用ScaleTransform)绑定到ProgressValue
  5. 首先是新的控制代码:

    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();
        }
    }
    

    现在从http://msdn.microsoft.com/en-us/library/ms750638%28VS.90%29.aspx

    获取来自MSDN(.net 3.5版本,而不是4)的组合框示例样式

    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>
    

    就是这样

答案 1 :(得分:0)

出于不同的原因我有类似的要求(我有一个在网络扫描后自动填充的组合)。看看这个问题&amp;答案可以帮助您:WPF ComboBox - showing something different when no items are bound