2017-12-16 12 views
0

私のコンボボックスの描画には助けが必要です。私はピッキングのための色のコンボボックスを作りたいと思う。私はインターネット上でいくつかのものを見つけましたが、誰も働いていません。これは私のdrawItem方法Comboboxを使用したC#Wpf図面

<Grid> 
     <ComboBox x:Name="MyComb" HorizontalAlignment="Left" Margin="66,81,0,0" VerticalAlignment="Top" Width="120" /> 

    </Grid> 

ある

private void MyComb_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      System.Drawing.Rectangle rect = e.Bounds; 
      ColorConverter converter = new ColorConverter(); 
      if (e.Index >= 0) 
      { 
      string n = ((ComboBox)sender).Items[e.Index].ToString(); 
       System.Drawing.Color c = (System.Drawing.Color)converter.ConvertFromString(n); 
       SolidBrush b = new SolidBrush(c); 
       g.FillRectangle(b, rect.X + 110, rect.Y + 5, 
        rect.Width - 10, rect.Height - 10); 
      } 

     } 

これは、コンボボックス

Type colorType = typeof(System.Drawing.Color); 
      PropertyInfo[] propInfoList = colorType.GetProperties(BindingFlags.Static | 
                    BindingFlags.DeclaredOnly | BindingFlags.Public); 
      foreach (PropertyInfo c in propInfoList) 
      { 
       MyComb.Items.Add(c.Name); 

      } 

そして、ここで私は色名でコンボボックスを満たしていますし、私が欲しいの定義です:これまでのところ私はこれを持っています色の名前に応じて実際の色とcomboxを埋めるために..しかし、私の描画アイテムメソッドは決して呼び出されません。私はいくつかのDrawItemハンドラを作成しようとしましたが、私のコンボボックスにはそのようなことはありません...次に、コンボボックスのDrawModeプロパティを設定することについて何かを読んだが、コンボボックスはその種類のプロパティを全く持たない... 私はネットフレームワークv.4.6.1 誰にでも教えてください。何が欠けていますか?

は、あなたが抱えている最大の問題はあなたがWPFのAPIを使用しているにもかかわらず、WinformsのAPIのために書かれたコード例を使用しようとしているということです非常に

+1

このコードはWinFormになっています。 –

答えて

1

、ありがとうございました。今後の参考として、は、オンラインで見つけたチュートリアルやその他のリソースのコンテキストを識別し、シナリオに実際に適用されることを確認するために、さらに注意する必要があります。

それが起こるように、我々はすでに、スタックオーバーフローに関連する質問の数を持っている:

WPF ComboBox as System.Windows.Media.Colors>
WPF - Bind ComboBox Item Foreground to Its Value
Very simple color picker made of combobox

をこれらはすべてあなたに潜在的に有用であるが、すべてに基づいていますこの質問への回答:

How can I list colors in WPF with XAML?

元はの名前をという色で表示していたので、XAMLの<ObjectDataProvider/>要素を使ってショートカットをとった。これは、string値またはPropertyInfoインスタンスから適切な色またはブラシに変換するために、他の質問でコンバータを使用する必要が生じました。

実際に、ある種のMVVMアプローチを使用するようにコードがすでに記述されている場合、特にColorsタイプのカラー値を取得するためのコードビハインドが既に書かれているか、 WPF Colors型の代わりにWinforms Color型を使用していますが、Winformsではうまくいきますが、WPF APIはCode Analysis/FxCopの規則に従い、名前付きの色はColorsタイプ)、それを固執してバインドできる直接ビューモデルのデータ構造を提供することは理にかなっています。

この方法では、アイテム図面の手続き的な実装を提供するのではなく、XAMLにと記述し、各アイテムの外観をと記述します。

ここに&hellipの例があります。

まず、いくつかの単純なビューモデルのデータ構造:実際の色を使用して、

<Window x:Class="TestSO47850587ColorComboBox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:l="clr-namespace:TestSO47850587ColorComboBox" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.DataContext> 
    <l:MainViewModel/> 
    </Window.DataContext> 

    <StackPanel> 
    <ComboBox Width="100" ItemsSource="{Binding Colors}" 
       HorizontalAlignment="Left" Grid.IsSharedSizeScope="True" 
       SelectedValuePath="Brush" SelectedValue="{Binding SelectedColor}"> 
     <ComboBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type l:ColorViewModel}"> 
      <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxItem"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Name}" Background="{Binding Brush}" HorizontalAlignment="Stretch"/> 
      </Grid> 
     </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

    <Rectangle HorizontalAlignment="Stretch" Height="24" Fill="{Binding SelectedColor}"/> 
    </StackPanel> 
</Window> 

上記表示色名:手のものと

// Very simple container class 
class ColorViewModel 
{ 
    public Brush Brush { get; } 
    public string Name { get; } 

    public ColorViewModel(Brush brush, string name) 
    { 
     Brush = brush; 
     Name = name; 
    } 
} 

// Main view model, acts as the data context for the window 
class MainViewModel : INotifyPropertyChanged 
{ 
    public IReadOnlyList<ColorViewModel> Colors { get; } 

    private Brush _selectedColor; 
    public Brush SelectedColor 
    { 
     get { return _selectedColor; } 
     set { _UpdateField(ref _selectedColor, value); } 
    } 

    public MainViewModel() 
    { 
     Colors = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public) 
      .Select(p => new ColorViewModel(new SolidColorBrush((Color)p.GetValue(null)), p.Name)) 
      .ToList().AsReadOnly(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void _UpdateField<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, newValue)) 
     { 
      field = newValue; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

は、XAMLはストレートフォワードであります背景として。本当に欲しいのが四角形の場合は、要素をFillプロパティにバインドして<Rectangle/>要素に置き換えることができます。当然ながら、マージンを持つ長方形など、他の視覚効果を得ることができます。必要に応じてデータテンプレートを設定するだけです。

ここでのポイントは、良いWPFプログラミングを定義するデータバインディングの方法を取り入れて、間違いなくでなければなりません。 WPFのWinformsコード例の誤りです。 :)

関連する問題