代码之家  ›  专栏  ›  技术社区  ›  myermian

WPF:强制大写的组合框?

  •  4
  • myermian  · 技术社区  · 14 年前

    我不知道为什么,但从一个角度来看,没有一个解决方案对我有效 similar question .

    我意识到 TextBox 他有财产( CharacterCasing )可以设置为 Upper 将任何小写输入更改为大写。它工作得非常好,因为用户在打字时从不被打断,大写锁定和移位不会对它产生负面影响,其他非字母字符也不会受到负面影响。

    问题是没有选项将此属性用于组合框。类似帖子的解决方案似乎对我不起作用。我想复制CharacterCasing属性,但不是一个组合框。我不介意它是附属财产,事实上,那太好了。我直接在xaml对象上尝试了几个不同的事件,但没有成功。

    1 回复  |  直到 7 年前
        1
  •  15
  •   Thomas Levesque    11 年前

    这个 ComboBox 模板使用 TextBox 什么时候 IsEditable 这是真的。因此,您可以替换要设置的模板 CharacterCasing 文本框 ,或创建将查找 文本框 按其名称(“PART_EditableTextBox”)并设置 字符框 这是我的财产。

    下面是附加属性解决方案的一个简单实现:

    public static class ComboBoxBehavior
    {
    
        [AttachedPropertyBrowsableForType(typeof(ComboBox))]
        public static CharacterCasing GetCharacterCasing(ComboBox comboBox)
        {
            return (CharacterCasing)comboBox.GetValue(CharacterCasingProperty);
        }
    
        public static void SetCharacterCasing(ComboBox comboBox, CharacterCasing value)
        {
            comboBox.SetValue(CharacterCasingProperty, value);
        }
    
        // Using a DependencyProperty as the backing store for CharacterCasing.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CharacterCasingProperty =
            DependencyProperty.RegisterAttached(
                "CharacterCasing",
                typeof(CharacterCasing),
                typeof(ComboBoxBehavior),
                new UIPropertyMetadata(
                    CharacterCasing.Normal,
                    OnCharacterCasingChanged));
    
        private static void OnCharacterCasingChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            var comboBox = o as ComboBox;
            if (comboBox == null)
                return;
    
            if (comboBox.IsLoaded)
            {
                ApplyCharacterCasing(comboBox);
            }
            else
            {
                // To avoid multiple event subscription
                comboBox.Loaded -= new RoutedEventHandler(comboBox_Loaded);
                comboBox.Loaded += new RoutedEventHandler(comboBox_Loaded);
            }
        }
    
        private static void comboBox_Loaded(object sender, RoutedEventArgs e)
        {
            var comboBox = sender as ComboBox;
            if (comboBox == null)
                return;
    
            ApplyCharacterCasing(comboBox);
            comboBox.Loaded -= comboBox_Loaded;
        }
    
        private static void ApplyCharacterCasing(ComboBox comboBox)
        {
            var textBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox;
            if (textBox != null)
            {
                textBox.CharacterCasing = GetCharacterCasing(comboBox);
            }
        }
    
    }
    

    下面是如何使用它:

        <ComboBox ItemsSource="{Binding Items}"
                  IsEditable="True"
                  local:ComboBoxBehavior.CharacterCasing="Upper">
            ...