2014-01-05 36 views
4

我想知道如何以編程方式禁用組合框下拉按鈕。我曾見過許多類似的主題,但所有這些都有XAML解決方案。順便說一句,如果有人知道如何禁用所有組合框控件設計,並只留下可見的項目模板,它也可以有幫助。WPF組合框隱藏(禁用)以編程方式下拉按鈕

UPDATE

其我的XAML定義

<ComboBox Name="lang_ComboBox" SelectionChanged="LanguageSelection_ComboBox_SelectionChanged"/> 

而且有我如何使用它:

String text = "dorf"; 
BitmapImage image = new BitmapImage(new Uri("http://img88.imageshack.us/img88/4351/butchermi4.png")); 
lang_ComboBox.Width = 100; 
lang_ComboBox.Height = 30; 
Grid sp; 
for (int i = 0; i < 5; i++) 
{ 
    ColumnDefinition gridCol1 = new ColumnDefinition(); 
    gridCol1.Width = new GridLength(30.0); 
    ColumnDefinition gridCol2 = new ColumnDefinition(); 
    gridCol2.Width = new GridLength(70.0); 
    sp = new Grid() 
    { 
     Width = 100, 
     Height = 30 
    }; 
    Image im = new Image() 
    { 
     Source = image, 
     Width = 25, 
     Height = 25 
    }; 
    Label la = new Label() 
    { 
     Content = text 
    }; 
    sp.ColumnDefinitions.Add(gridCol1); 
    sp.ColumnDefinitions.Add(gridCol2); 
    Grid.SetColumn(im, 0); 
    Grid.SetColumn(la, 1); 
    sp.Children.Add(la); 
    sp.Children.Add(im); 
    lang_ComboBox.Items.Add(sp); 
} 

更新2 嗯我現在明白了,我用錯字。它應該是「隱藏」控制設計,仍然可以從列表中選擇。我很抱歉。但我知道我可以用Anatoliy Nokolaev的守則解決它。要隱藏控制設計使用:

ToggleButton dropDownButton = GetFirstChildOfType<ToggleButton>(lang_ComboBox); 
dropDownButton.Visibility = System.Windows.Visibility.Collapsed; 

不受歡迎的行爲,現在只有我不能顯示組合框dropdownmenu,但我會編程調用它通過單擊事件添加,應該是不錯的。

如果有任何最簡單的方法可以告訴我:)。

+0

我可以給你一個更簡單的解決方案,但它將取決於'ComboBox'模板,你安排它?如果是,那麼我可以在答案中舉一個例子。 –

+0

@Anatoliy Nikolaev我總是想學習新的東西,然後肯定顯示它:) –

+0

好吧,給我時間,我會告訴你。 –

回答

4

要禁用只有ToggleButtonComboBox程序,您需要使用VisualTreeHelper找到這個在ComboBox控制和分配財產IsEnabled,像這樣:

XAML

<Window x:Class="DisableComboBoxButton.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    Loaded="Window_Loaded"> 

    <StackPanel> 
     <ComboBox Name="comboBox" 
        Width="100" 
        Height="25" 
        SelectedIndex="0"> 

      <ComboBoxItem>Test1</ComboBoxItem> 
      <ComboBoxItem>Test2</ComboBoxItem> 
      <ComboBoxItem>Test3</ComboBoxItem> 
     </ComboBox> 

     <ComboBox Name="AllComboBoxDisabled" 
        Width="100" 
        Height="25" 
        IsEnabled="False" 
        SelectedIndex="0"> 

      <ComboBoxItem>Test1</ComboBoxItem> 
      <ComboBoxItem>Test2</ComboBoxItem> 
      <ComboBoxItem>Test3</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</Window> 

Code-behind

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     ToggleButton dropDownButton = GetFirstChildOfType<ToggleButton>(comboBox); 

     dropDownButton.IsEnabled = false; 
    } 

    public static T GetFirstChildOfType<T>(DependencyObject dependencyObject) where T : DependencyObject 
    { 
     if (dependencyObject == null) 
     { 
      return null; 
     } 

     for (var i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++) 
     { 
      var child = VisualTreeHelper.GetChild(dependencyObject, i); 

      var result = (child as T) ?? GetFirstChildOfType<T>(child); 

      if (result != null) 
      { 
       return result; 
      } 
     } 

     return null; 
    } 
} 

Output

enter image description here

Notes

務必僅當控制將滿載GetFirstChildOfType()功能,否則將無法找到它,並給。在這種情況下,我將這段代碼放在事件Window_Loaded中,該事件表示窗口的所有控件都已成功加載。

Edit: another version

不是說這個版本更容易實現,但它會更正確,更有點更容易使用。

所以,我們需要一個模板ComboBox,因爲它允許訪問控件中的元素。就像這樣,ToggleButton無法從代碼和XAML訪問。

我們創建附加的依賴項屬性,該屬性將爲當前的ComboBox服務另一個屬性,例如可以訪問我們的按鈕可見性的屬性。

我們的財產Visibility

public static class ButtonExt 
{ 
    public static readonly DependencyProperty VisibilityProperty; 

    public static void SetVisibility(DependencyObject DepObject, Visibility value) 
    { 
     DepObject.SetValue(VisibilityProperty, value); 
    } 

    public static Visibility GetVisibility(DependencyObject DepObject) 
    { 
     return (Visibility)DepObject.GetValue(VisibilityProperty); 
    } 

    static ButtonExt() 
    { 
     PropertyMetadata VisibiltyPropertyMetadata = new PropertyMetadata(Visibility.Collapsed); 

     VisibilityProperty = DependencyProperty.RegisterAttached("Visibility", 
                  typeof(Visibility), 
                  typeof(ButtonExt), 
                  VisibiltyPropertyMetadata); 
    } 
} 
在組合框模板

二傳手屬性(在App.xaml文件跳過版本,完整版本見項目):

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ComboBox}"> 
      <Grid> 
       <ToggleButton Name="ToggleButton" 
           Template="{StaticResource ComboBoxToggleButton}" 
           IsChecked="{Binding Path=IsDropDownOpen, 
                Mode=TwoWay, 
                RelativeSource={RelativeSource TemplatedParent}}" 
           Visibility="{TemplateBinding PropertiesExtension:ButtonExt.Visibility}" // <------ Here 
           Grid.Column="2" 
           Focusable="False"       
           ClickMode="Press" /> 

現在,我們正在設置該屬性像這樣:

<ComboBox Name="comboBox" 
      Style="{StaticResource ComboBoxBaseStyle}" 
      PropertiesExtension:ButtonExt.Visibility="Visible" 
      Width="100" 
      Height="30" 
      SelectedIndex="0"> 

    <ComboBoxItem>Test1</ComboBoxItem> 
    <ComboBoxItem>Test2</ComboBoxItem> 
    <ComboBoxItem>Test3</ComboBoxItem> 
</ComboBox> 

or in code-behind via Click事件處理程序:

private void HideButton_Click(object sender, RoutedEventArgs e) 
{ 
    ButtonExt.SetVisibility(comboBox, Visibility.Hidden); 
} 

private void ShowButton_Click(object sender, RoutedEventArgs e) 
{ 
    ButtonExt.SetVisibility(comboBox, Visibility.Visible); 
}  

示例項目的完整版本是here

+0

@Tunczyk:請參閱我的編輯。 –

+0

Nokolaev感謝男人:) –