wpf combobox样式不显示倒三角

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf combobox样式不显示倒三角相关的知识,希望对你有一定的参考价值。

当鼠标移动到Combobox上面时显示倒三角,移出的时候不显示倒三角

参考技术A

解决思路如下:用blend打开combobox模板,对其mouseover state加操作,我这边是对combobox的tag做了设置(当state为mouseover的时候,设置combobox的tag为1),然后在打开combobox里togglebutton的模板,找到小箭头(其实是个path),将其visibility属性模板绑定到togglebutton的tag属性。blend生成的样式代码我都放在附件中了,可以去看下。

本回答被提问者采纳

WPF ComboBox 绑定到不显示所选项目文本的用户控件集合

【中文标题】WPF ComboBox 绑定到不显示所选项目文本的用户控件集合【英文标题】:WPF ComboBox Bound to Collection of UserControls Not Showing Selected Item's Text 【发布时间】:2011-03-06 16:05:49 【问题描述】:

我有一个绑定到自定义 UserControls 的 ObservableCollection 的 ComboBox。每个用户控件都有一个 Tag 值集,并且 ComboBox 的 DisplayMemberPath 设置为“Tag”。当单击ComboBox时,这会正确显示下拉列表中的每个UserControl的标记,但是选择列表中的项目并关闭下拉列表时,ComboBox在按钮中显示任何内容。

如果我将 UserControl 替换为标准 WPF 控件(例如 TextBox),那么它会正确显示所选项目的 Tag 值,因此它与绑定到 UserControl 与标准 WPF 控件有关。另外,如果我将 IsEditable 设置为 True,则可编辑的 TextBox 会正确显示标签,但我不希望文本可编辑。

如何在 ComboBox 未展开时显示 Selected 项?

这里是一些复制问题的示例代码:

(注意:示例代码是从它运行的应用程序的上下文中取出的,因此它尝试执行的操作看起来有点奇怪,但仍然会导致相同的症状)。

MyUC.xaml

<UserControl x:Class="ComboboxTest.MyUC"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBox />
    </Grid>
</UserControl>

Window1.xaml

<Window x:Class="ComboboxTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ComboboxTest"
        Title="Window1" Height="300" Width="300"
        DataContext="Binding RelativeSource=RelativeSource Self">
<StackPanel>
    <StackPanel Name="ControlsHolder">
        <TextBox Tag="Box 1" Text="This is in Box 1" />
        <TextBox Tag="Box 2" Text="This is in Box 2" />
        <local:MyUC Tag="UC 1" />
        <local:MyUC Tag="UC 2" />
    </StackPanel>
    <Grid>
        <ComboBox Grid.Column="1" 
              Margin="5,0" 
              Name="MyComboBox" 
              ItemsSource="Binding MyControls"
              DisplayMemberPath="Tag" 
              MinWidth="120"/>
    </Grid>
</StackPanel>

Window1.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace ComboboxTest

    public partial class Window1 : Window, INotifyPropertyChanged
    
        ObservableCollection<MyUC> myControls = new ObservableCollection<MyUC>();

        public Window1()
        
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Window1_Loaded);
        

        void Window1_Loaded(object sender, RoutedEventArgs e)
        
            myControls.Clear();

            foreach (UIElement uiElement in this.ControlsHolder.Children)
            
                MyUC tb = uiElement as MyUC;

                if (tb != null)
                
                    myControls.Add(tb);
                
            

            RaisePropertyChanged("MyControls");
        

        public ObservableCollection<MyUC> MyControls
        
            get
            
                return this.myControls;
            
        

        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string p)
        
            if (PropertyChanged != null)
            
                PropertyChanged(this, new PropertyChangedEventArgs(p));
            
        
    

此应用显示为: ComboBox with Drop Down Visible http://img229.imageshack.us/img229/5597/comboboxtestexpanded.png

以及选择“UC 2”时,它显示为: ComboBox with selected item not visible http://img692.imageshack.us/img692/4362/comboboxtestuc2selected.png

【问题讨论】:

【参考方案1】:

绑定UIElements 列表不是一个好主意。尝试使用包装类:

public partial class Window1 : Window

    public Window1()
    
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Window1_Loaded);
        MyComboBox.ItemsSource = MyControls;
    

    ObservableCollection<Wrapper> myControls = new ObservableCollection<Wrapper>();

    void Window1_Loaded(object sender, RoutedEventArgs e)
    
        myControls.Clear();

        foreach (UIElement uiElement in this.ControlsHolder.Children)
        
            MyUC tb = uiElement as MyUC;

            if (tb != null)
            
                myControls.Add(new Wrapper(tb));
            
        

        RaisePropertyChanged("MyControls");
    

    public ObservableCollection<Wrapper> MyControls
    
        get
        
            return this.myControls;
        
    

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string p)
    
        if (PropertyChanged != null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(p));
        
    


public class Wrapper

    public UserControl Control  get; protected set; 

    public Wrapper(UserControl control)
    
        Control = control;
    

    public Object Tag
    
        get  return Control.Tag; 
    

【讨论】:

感谢 decyclone,成功了。但是你有没有解释为什么将它包装在另一个类中,以及为什么绑定到 UIElement 是一个坏主意? 通过将 UserControls 添加到 ItemsSource,它们不会成为 ComboBox 的 VisualTree 的一部分。 ItemsSource 中的每个对象都使用 ComboBoxItem 进行包装。这就是为什么它们在 ComboBox 中不能很好地显示的原因。在使用 ItemsSource 绑定时,建议使用类而不是 UIElements。 我很惊讶地发现有人遇到了完全相同的问题。创建实用程序以在 Prism 模块(即用户控件)上设置 Active Directory 组权限。想让用户选择要设置权限的模块。如果他们不显示,那就危险了!谢谢!

以上是关于wpf combobox样式不显示倒三角的主要内容,如果未能解决你的问题,请参考以下文章

WPF中combobox显示多列的下拉框

自定义WPF ComboBox不显示分组

WPF:为啥我的 ComboBox SelectedItem 不显示?

wpf中ComboBox控件 偶尔不显示下拉框

wpf combobox 关闭窗口后,再次调用不显示已经选择的值?

WPF ComboBox 绑定到不显示所选项目文本的用户控件集合