2011-12-04 3 views
3

몇 달 전에 C# 응용 프로그램에서 ListBox를 일부 UserPanels의 컨테이너로 사용하기 시작했습니다. 패널이 선택되면 목록 상자 항목과 마찬가지로 강조 표시됩니다. 나는 (내가 원래이 발견 또는 내가 그것을 링크 할 위치를 확실하지 않음)이 잘 작동명명 된 스타일 간 변경

<Application.Resources> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="border" Background="Transparent"> 
         <ContentPresenter /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter TargetName="border" Property="Background"> 
           <Setter.Value>Transparent</Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Application.Resources> 

하지만 지금은 가끔이 필요합니다 내가 모든 항목을 투명한 배경을 제공하기 위해 추가 할 수 있었다 다음 XAML을 발견 배경색 대신 투명 한 배경색. 목록 상자가 하나 뿐이므로 코드 비헤이비어에서 스타일을 프로그래밍 방식으로 변경하려고합니다.

코드에서 스타일을 변경하는 예를 발견했지만이 두 가지 스타일을 만들 수 없습니다. 나는 그것에게 도끼를 주었다 : name = "transparentListbox", 그것을 복사하고 다른 한 x : name = "normalListbox"Blue의 배경을 주었다. 그러나 두 가지 스타일 요소가있는 XML 구문 분석 예외를 얻는다. 일반적으로 모든 목록 상자를 수정하려고합니다.

필요에 따라 코드를 전환 할 수있는 동일한 작업 (항목을 선택하면 배경 수정)을 수행하는 두 개의 명명 된 스타일을 어떻게 가질 수 있습니까?


편집 : 내 목록 상자가 UserPanels를 저장하는 데 사용되는 모든 경우에

. lstPanels.Items.Add (p)를 사용하여 목록 상자에 추가합니다. 여기서 p는 UserPanel에서 파생 된 클래스의 인스턴스입니다.

처음으로 응용 프로그램을 만들 때 투명도가 필요한 창에이 스타일이 적용되고 항목을 선택해야하는 창이 없었습니다. 여러 창을 관리하는 것이 번거로워 져서 하나의 창에 다시 팩터 리되었으며 목록 상자가 지워지고 모드가 변경 될 때 여러 유형의 패널이로드됩니다. 일부는 여전히 투명한 배경이 필요했지만 지금은 그렇지 않습니다.

프로그래밍 방식으로 전체적으로 목록 상자에 명명 된 스타일을 지정하면 모드가 변경 될 때 괜찮습니다. 모든 ListBoxItem에 스타일을 할당하려면 해당 기능이 퍼져 나감에 따라 많은 코드가 업데이트되어야합니다.

아마도 해결책은 단일 스타일을 유지하는 것이지만 가능하다면 배경 속성을 가변적으로 바인딩하는 것일까 요?

답변

2

저는 항상 내 UserControl.Resources 섹션에 스타일을 만들었습니다.귀하의 경우에는

:

<Style x:Key="ListBoxStyle1" TargetType="MyDerivedListBoxItem"> 

...

<Style x:Key="ListBoxStyle2" TargetType="MyDerivedListBoxItem"> 

...

나는 스타일이 방법을 설정 한 뒤에 코드에서

.

If Not MyListBox.ItemContainerStyle.Equals(CType(Resources("ListBoxStyle1"), Style)) Then 
        MyListBox.ItemContainerStyle= CType(Resources("ListBoxStyle1"), Style) 
+0

키 "StandardListboxItem"을 추가하고 두 스타일을 응용 프로그램의 리소스 대신 내 창 리소스로 옮긴 다음이 줄을 사용했습니다. lstPanels.Style = (Style) FindResource ("StandardListboxItem"); 내부 예외로 XMLParse 예외가 throw됩니다. { " ''ListBoxItem 'TargetType이'ListBox '요소 유형과 일치하지 않습니다.'} 아이디어가 있으십니까? – Eric

+0

ListBoxItem이 아닌 ListBox에 스타일을 적용하고 있습니다. 아이템을 반복하고 스타일을 변경해야 할 수도 있습니다. –

+0

조금 성 가시고 있습니다. 응용 프로그램이 모드를 변경하는 단일 지점에서 목록 상자에 스타일을 적용하는 것이 한 가지이지만 각 항목의 개별 스타일을 관리하는 것은 약간의 고통입니다. – Eric

1

코드에서 스타일을 수정하려고하지 않아도됩니다. 그것은 실현 가능하고 심지어 일할 수도 있지만 그것은 저에게 고통의 세계처럼 보입니다. 도움이 될 수있는 한 가지 아이디어는 ListBoxItem에서 상속 받아 자신 만의 컨트롤을 정의 할 수 있다는 것입니다. 그런 다음 bool 또는 뭔가 유형의 UseAlternateBackgroundColor와 같은 상속자에 종속성 속성을 넣을 수 있습니다.

그런 다음, 당신이 당신의 스타일을 수정 것 :

<Style TargetType="MyDerivedListBoxItem"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type MyDerivedListBoxItem}"> 
       <Border x:Name="border" Background="Transparent"> 
        <ContentPresenter /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter TargetName="border" Property="Background"> 
          <Setter.Value>Transparent</Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="UseAlternateBackgroundColor" Value="true"> 
         <Setter TargetName="border" Property="Background"> 
          <Setter.Value>Black</Setter.Value> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

는 일반적으로, 나는 개인적으로 가능한 한 코드 레이아웃 및 시각적 스타일 고려 사항을 처리하지 않도록하려고합니다.

+0

유스 케이스에 대한 자세한 내용은 제 질문을 수정했습니다. 목록 상자에 추가하는 것은 UserPanel에서 파생 된 클래스이므로 파생 된 ListBoxItem을 만들 수있는 방법은 없습니다. – Eric

1

x:Key 지시문을 다르게 설정해야합니다. 스타일이 리소스라면 어쨌든 Name은 쓸모가 없습니다. 키를 설정하지 않으면 TargetType이 대신 키로 사용되어 충돌을 일으 킵니다. 코드에 스타일 중 하나를 적용하려면 FindResource을 해당 키와 함께 호출하면됩니다.