需要更换第三方WinForm控件,什么是壁橱WPF等效?

时间:2010-04-27 18:58:37

标签: .net wpf user-interface wpf-controls wpftoolkit

我厌倦了Windows Forms ...我就是这样。我不是想开始辩论,我对此感到厌倦。不幸的是,我们已经依赖于DevExpress XtraEditors中的4个控件。 I 对他们只有困难,我想继续前进。

我现在需要的是我正在使用的4个控件的壁橱替换件。他们在这里:

LookUpEdit - 这是combobox,可在您键入时过滤下拉列表。

MemoExEdit - 这是textbox,当它有焦点时“弹出”更大的区域

CheckedComboBoxEdit - 这是checkboxes的下拉列表。

CheckedListBoxControl - 这是一个很好的圆柱listbox checkboxes

这是一个有大量数据输入的LOB应用程序。实际上,前两个很好,但不是必需的。第二个是必不可少的,因为我要么需要复制功能,要么改变用户与特定数据交互的方式。

我正在寻找帮助,使用现有控件( codeplex等)或直接WPF XAML 环境中复制这些内容。任何代码或方向都会受到高度赞赏,但主要是我希望避免任何商业第三方WPF,而是希望专注于自己构建它们(但我需要方向)或使用Codeplex

1 个答案:

答案 0 :(得分:9)

WPF的一个美妙之处是自定义控件是多么容易(特别是与WinForms相比时)。根据您给出的描述,所有这些控件都可以使用标准工具箱控件非常简单地创建;我认为您不需要购买任何第三方解决方案。从顶部开始:

  1. LookUpEdit - 你可以使用WPF组合框免费获得这个
  2. MemoExEdit - 使用标准TextBox控件和Popup原语,您可以用相对较少的努力复制此效果
  3. CheckedComboBoxEdit - WPF ComboBoxItemsControl,这意味着它支持自定义项模板。您可以使用几行XAML轻松完成此操作。
  4. CheckedListBoxControl - 对于ListBox同样的事情,使用ItemTemplate属性,您可以立即执行此操作。
  5. 以下是如何实现类似于CheckedComboBoxEdit的控件的快速示例。首先,代码隐藏:

    public partial class CustomControls : Window
    {
        public ObservableCollection<CustomItem> Items
        {
            get;
            set;
        }
    
        public CustomControls()
        {
            Items = new ObservableCollection<CustomItem>();
            Items.Add(new CustomItem() { Name = "Item 1", Checked = true });
            Items.Add(new CustomItem() { Name = "Item 2", Checked = false });
            Items.Add(new CustomItem() { Name = "Item 3", Checked = false });
    
            InitializeComponent();
        }
    }
    
    public class CustomItem
    {
        public bool Checked
        {
            get;
            set;
        }
    
        public string Name
        {
            get;
            set;
        }
    }
    

    现在,Window

    的XAML
    <Window x:Class="TestWpfApplication.CustomControls"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CustomControls" Height="200" Width="200"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <ComboBox ItemsSource="{Binding Items}" 
              VerticalAlignment="Center"
              HorizontalAlignment="Center"
              Width="100">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}" 
                          IsChecked="{Binding Checked}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    ItemTemplate属性所说的是,“对于此控件中的每个项目,请将其中的一个作为其中之一。”因此,对于Items的{​​{1}}集合中的每个项目,都会生成ComboBox,其CheckBox绑定到项目类的Content属性,及其Name属性绑定到IsChecked属性。

    这是最终结果:

    alt text http://img155.imageshack.us/img155/9379/customcontrols.png