2009-05-19 10 views
3

無効なComboBoxの視覚的なプロパティを与えずに、WPFのComboBoxの値を変更しないようにする方法はありますか?たとえば、テキストフィールドの場合、IsReadOnlyプロパティをtrueに設定できます。ただし、ComboBoxに対してこれを実行しても、ユーザーが異なる値を選択することはできません。外観を変更せずにComboBoxを無効にする

答えて

8

氏Benagesを含める必要があります、私はIsHitTestVisibの設定だと思いますComboBoxでfalseにフォーカスすると、そのトリックを行う可能性があります。お役に立てれば。

+0

これはトリックでした。お手伝いいただきありがとうございます。 –

+0

このソリューションは、キーボードのナビゲーションをブロックしないという点でまだ問題があるようです。 – jpierson

+0

@jpierson:チェックして、キーボードのナビゲーションをブロックします。私はコントロールを介してタブでComboBoxに到達しようとしましたが、私はComboBoxを選択することができませんでした。 – KMC

0

これはユーザビリティ/慣習の観点からは良い考えですか?あなたの目標が可読性である場合は、無効な色を変更してコントラストを少し上げてください。

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

はとにかく、私はあなたが前のエントリに値をリセットするためにonChangeイベントハンドラを書くことができ疑います。

+0

この理由は、それが単にいくつかを持っている必要があり、既存の画面だという事実によるものです機能は低下しましたが、私は同じルック・アンド・フィールを保ちたいと思っています。アプリケーションのこの部分には少数のユーザーしかいません。私はすでに画面上でいくつかのウォークスルーを行って、使用方法や見た目を正確に把握しています。 –

+0

これを無効にしたいのであれば、なぜcomboBOxを使用するのですか –

0

フォアグラウンドとバックグラウンドの色を設定できます。これは無効な色を上書きするようです。ドロップダウンボタンは無効になっていますが、これは良好です。

私のコード私は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> 
+0

これを試してみて、違いは見られませんでした。 –

+0

申し訳ありません、それは助けになりませんでした。私は助けになる場合に備えて完全なファイルを更新しました。 – Crispy

0

イム.NETでの同じ場合は背面のIピクチャボックス、フレームまたは他の容器を取得するために使用VB6の日でわからない(すみません、私の頭の上から、私はどの覚えていないことができます) 。私はその中にコンボボックスを入れます。ユーザーには同じように見えます。コンテナを無効にすると、コンボボックスもロックアウトされ、正常に見えます。

4

私は無効なコントロールは、あなただけの標準的な1つ(または1あなたの使用して)にコンボボックスのControlTemplateを設定することができます無効に見える必要があることに同意しますがこれはあなたの読み取り専用探してまともに与える標準機能

などのいずれかを削除しますコンボボックス

<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> 

では、次の名前空間

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
0

なぜ、comboBoxを使用しますか?

私の選択肢は、これが表示専用画面であることを示すコントロールの代わりに使用される境界内のラベルです。

コンボボックスのように見える場合は、ボタンのようなテーマのオブジェクトを使用できますが、クリックすることはできません。灰色のドロップダウン矢印を描くこともできるので、コンボボックスのように見えます。

実際にラベルがうまくいくと、人々が対話できない画面上に実際にコンボボックスがあるのは残念です。

0

...別の値を選択するからユーザーを防ぎます。あなたには、いくつかのコンボボックスのメソッドをオーバーライドすることにより、キーボード入力を無効にすることができスタイリングの上に

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); 
     } 
    } 
} 
関連する問題