Desativar ComboBox sem alterar Aparência

votos
3

Existe uma maneira de desativar alterando o valor de uma caixa de combinação em WPF sem dar-lhe as propriedades visuais de um ComboBox desativado? Por exemplo, eu sei que para um campo de texto que você pode definir a propriedade IsReadOnly para true. Fazendo isso por uma caixa de combinação no entanto, não impede que o usuário selecione um valor diferente.

Publicado 19/05/2009 em 16:25
fonte usuário
Em outras línguas...                            


7 respostas

votos
8

Mr. Benages, eu acho que a criação IsHitTestVisible e Focusable para false na caixa de combinação pode fazer o truque. Espero que isto ajude.

Respondeu 19/05/2009 em 17:40
fonte usuário

votos
4

Embora concorde que um controle deficiente o OLHAR deficiente você poderia apenas definir o ComboBox ControlTemplate para o padrão (ou um seu usando) remover qualquer uma das funcionalidades padrão

eg Isto lhe dará um digno combobox readonly procura

  <ComboBox>
    <ComboBox.Template>
        <ControlTemplate TargetType="{x:Type ComboBox}">
          <Grid>
            <Microsoft_Windows_Themes:ListBoxChrome x:Name="Border" Height="23" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" RenderMouseOver="{TemplateBinding IsMouseOver}"/>
            <TextBlock FontSize="{TemplateBinding FontSize}" VerticalAlignment="Center" Text="Selected Item" Margin="5,0,0,0"></TextBlock>
          </Grid>
      </ControlTemplate>
    </ComboBox.Template>
  </ComboBox>

você precisa incluir o seguinte namespace

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
Respondeu 19/05/2009 em 17:11
fonte usuário

votos
0

... evitar que o usuário selecionar um valor diferente.

No topo do styling você pode desativar a entrada de teclado, substituindo alguns métodos ComboBox:

using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;

public class LockableComboBox : ComboBox
{

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (this.IsReadOnly)
        {
            e.Handled = true;
        }
        else
        {
            base.OnSelectionChanged(e);
        }
    }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (this.IsReadOnly)
        {
            if ((e.Key == Key.C || e.Key == Key.Insert)
                && (Keyboard.Modifiers & ModifierKeys.Control) 
                == ModifierKeys.Control)
            {
                // Allow copy
                Clipboard.SetDataObject(SelectedValue, true);
            }
            e.Handled = true;
        }
        else
        {
            base.OnPreviewKeyDown(e);
        }
    }

    protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        if (this.IsReadOnly) 
        {
            e.Handled = true;
        }
        else
        {
            base.OnPreviewTextInput(e);
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (this.IsReadOnly)
        {
            e.Handled = true;
        }
        else
        {
            base.OnKeyUp(e);
        }
    }
}
Respondeu 28/03/2013 em 18:03
fonte usuário

votos
0

Por que, então, usar uma caixa de combinação.

Minha escolha seria uma etiqueta dentro de uma fronteira que toma o lugar do controle, indicando que esta é uma tela de exibição somente.

Se ele deve olhar como um combobox, seria melhor usar um objeto temático como um botão, mas não clicável. Você pode até mesmo desenhar uma seta suspensa cinza por isso melhor aparência como um comboBox.

Parece apenas um exagero para realmente ter um combobox na tela que as pessoas não podem interagir com, quando um rótulo faria muito bem.

Respondeu 17/07/2012 em 00:43
fonte usuário

votos
0

Im não tem certeza se é o mesmo em .net no entanto nos dias VB6 i usar para obter uma caixa de imagem, quadro ou outro recipiente (desculpe fora do topo da minha cabeça, eu não me lembro qual). Gostaria de colocar a caixa de combinação dentro desse. Para os usuários parece o mesmo. Quando você desativar o recipiente isso iria bloquear a caixa de combinação, assim, deixando-o à procura normal.

Respondeu 19/05/2009 em 16:48
fonte usuário

votos
0

Você pode definir as cores primeiro plano eo fundo e que parece substituir as cores deficientes. O botão de lista pendente mostra como deficientes que é bom.

Editar o meu código que eu testado com no IE 6 / Kaxaml.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>
  <ComboBox  Foreground="black" Background="white" IsEditable="True" Text="Hello" IsEnabled="false">
  <ComboBoxItem>Test1</ComboBoxItem>
  <ComboBoxItem>Test2</ComboBoxItem>
  <ComboBoxItem>Test3</ComboBoxItem>
  </ComboBox>
  </StackPanel>
</Page>
Respondeu 19/05/2009 em 16:47
fonte usuário

votos
0

Tem certeza que isso é uma boa idéia do ponto de vista de usabilidade / convenções? Se seu objetivo é facilitar a leitura, talvez você pode mudar a cor desativado para colidir acima o contraste um pouco.

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/45dd7614-326b-4a51-b809-d25a3ff1ade8/

De qualquer forma, eu suspeito que você poderia escrever um manipulador de eventos onChange para redefinir o valor para a entrada anterior.

Respondeu 19/05/2009 em 16:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more