2017-12-16 1 views
0

내 콤보 박스를 그리는 데 도움이 필요합니다. 따기를위한 색상 콤보 박스를 만들고 싶습니다. 인터넷에서 물건을 발견했지만 아무도 일하고 ​​있지 않습니다. 지금까지이있다 :Combobox로 C# Wpf 그리기

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); 
      } 

     } 

이 내 drawItem 방법

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

    </Grid> 

입니다 이것은 내가 색 이름 콤보를 작성하고

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 속성 설정에 대한 내용을 읽었지 만 내 콤보 상자는 그 종류의 속성을 전혀 사용하지 않습니다 ... 인터넷을 사용하고 있습니다. framework v.4.6.1 아무에게도 말해 줄 수 있습니까? 내가 무엇을 놓치고 있습니까?

당신이 데있어 가장 큰 문제는 당신이 WPF API를 사용하는 경우에도 당신은 윈폼 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 형식을 사용하고 있습니다. & hellip; 다시 잘 작동하는 Winforms에서 WPF API는 코드 분석/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 코드 예제가 잘못되었습니다. :)