2013-11-22 3 views
0

현재 콤보 상자에서 선택한 항목에 적합한 스타일을 쓰려고합니다. 내가하는 이유는 ComboBox가 선택된 항목을 표시하는 방법을 많이 제어하지 못한다는 것입니다. 예를 들어 어두운 배경에서 항목은 여전히 ​​검은 색으로 표시됩니다.내용에 따라 스타일을 지정합니다.

나는 다음과 같은 솔루션과 함께 제공 :

<DataTemplate x:Key="MyItem" DataType="ComboBoxItem"> 
    <TextBlock Text="{Binding}" Foreground="White"/> 
</DataTemplate> 

<!-- (...) --> 

<Style TargetType="{x:Type ComboBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 

      <!-- ... --> 
      <!-- Displaying currently selected item --> 

       <ContentPresenter Margin="2" IsHitTestVisible="False" 
        VerticalAlignment="Center" HorizontalAlignment="Stretch" 
        Name="ContentSite" 
        ContentTemplate="{StaticResource MyItem}" 
        Content="{TemplateBinding ComboBox.SelectionBoxItem}" /> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

을 이제 간단한 ComboBoxItem를 선택하면, 그것은 제대로 콤보 상자에 표시됩니다. 반면에, 만약 내가 - 예를 들면 - 어떤 내용의 버튼을 표시한다면, 결과적으로 나는 무엇을 표현하고 싶지 않은지 System.Windows.Shapes.Rectangle이라는 텍스트를 얻습니다.

ComboBox에 표시된 여러 데이터 유형에 대해 서로 다른 템플릿을 사용하고 싶습니다. 모양을 사용자 정의 할 수 있습니다. 어떻게하면 될까요? 선택에 대한

Selected item in combo box

(하지 :


편집 :

완벽하게 명확하게하기 위해, 나는이 상황에서 선택 (= 선택) 콤보 항목에 대해서 이야기하고 콤보 상자 항목 콤보 상자 목록에)

답변

1
+0

당신이 작은 예제를 제공 주실 래요 내 DataTemplate을에 ContentTemplateSelector 것을 포함 할 수있는 방법? – Spook

+0

링크를 보셨습니까? –

+0

그래,하지만'ComboBox'에는'ContentTemplateSelector' 속성이없는 것 같습니다. – Spook

0

맞아,이 질문에는 몇 가지 측면이 있습니다. 그들 중 두 이러한 설정

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 

실험이의 배경 색상을 설정 텍스트와 두 가지의 색상을 정의 : 첫째로, 우리는 Resources 섹션으로이를 추가하여 기본 선택 색상 제거 할 수 선택한 항목. 실제로 여기에있는 색상을 사용하여 선택한 항목의 색상을 빠르게 변경할 수 있습니다 ... 모든 문제를 해결할 필요가 없습니다. 그러나 귀하의 예를 들어, 그냥 Transparent로 두십시오.

좋아, 다음에 ComboBox에 나타나는 각기 다른 데이터 유형에 대해 다른 모양을 사용하고 싶다면 ... 쉽게 얻을 수도 있습니다. 각 유형에 대해 DataTemplate을 선언하고 x:Key 속성을 암시 적으로 적용하도록 설정하면 안됩니다. 다음은 기본 예제입니다

당신이이 DataTemplate의 이러한 세 가지 유형의 항목으로 ComboBox을 채워 경우
<Window.Resources> 
    <DataTemplate DataType="{x:Type Type1}"> 
     <TextBlock Text="{Binding}" Foreground="Red" /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type Type2}"> 
     <TextBlock Text="{Binding}" Foreground="Green" /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type Type3}"> 
     <TextBlock Text="{Binding}" Foreground="Blue" /> 
    </DataTemplate> 
</Window.Resources> 

, 다음 항목이 Red에 착색 될 것이다, 녹색 and Blue`.

+0

너는 똑같은 "선택한 항목"에 대해 말하는거야? 내 질문에 약간의 수정을했는데, 내가 무슨 말을하고 있는지. – Spook

+0

너는 맞아, 나는 당신이 * 실제 * 선택한 항목에 대해 이야기하고 있다고 생각했지만 데이터 유형 인스턴스가 표시되는 곳마다 별도의 'DataTemplate'이 작동해야합니다. – Sheridan

0

나는 같은 문제에 대한 해결책을 모색하기 위해 모두 ContentTemplateSelector과 함께 해결책을 남겨 둘 것입니다.

  1. 는 라이브러리/응용 프로그램에 다음 클래스를 추가 :

    <DataTemplate x:Key="ComboBoxTextItem"> 
        <TextBlock Text="{Binding}" Foreground="{DynamicResource {x:Static vs:VsBrushes.WindowTextKey}}" /> 
    </DataTemplate> 
    
    <DataTemplate x:Key="ComboBoxOtherItem"> 
        <ContentPresenter Content="{Binding}" /> 
    </DataTemplate> 
    
  2. 당신이 그것을 사용하려는 스타일 내부의 선택기를 인스턴스화 :

    public class ComboBoxSelectionTemplateSelector : DataTemplateSelector 
    { 
    
        public DataTemplate TextTemplate 
        { 
         get; 
         set; 
        } 
    
        public DataTemplate ContentTemplate 
        { 
         get; 
         set; 
        } 
    
        public override System.Windows.DataTemplate SelectTemplate(object item, DependencyObject container) 
        { 
         if (item is string) 
          return TextTemplate; 
         else 
          return ContentTemplate; 
        } 
    } 
    
  3. 두 개의 서로 다른 DataTemplates을 정의합니다 :

    <Style.Resources> 
        <local:ComboBoxSelectionTemplateSelector ContentTemplate="{StaticResource ComboBoxOtherItem}" 
                  TextTemplate="{StaticResource ComboBoxTextItem}" x:Key="ContentTemplateSelector" /> 
    </Style.Resources> 
    
  4. ContentPresenter에서 그것을 사용

    <!-- ... --> 
    <ControlTemplate TargetType="ComboBox"> 
        <Grid> 
         <ContentPresenter ContentTemplateSelector="{StaticResource ContentTemplateSelector}" 
              Content="{TemplateBinding ComboBox.SelectionBoxItem}" /> 
         <!-- Other items --> 
         <Popup ... /> <!-- For displaying ComboBox's list --> 
        </Grid> 
    
관련 문제