2009-11-18 8 views
4

ListBox의 스타일을 지정하고 그 주위에 Border을 표시하고 싶습니다.WPF ListBox 트리거가 IsFocused 속성에서 작동하지 않습니다.

<Trigger Property="IsFocused" Value="True"> 
    <Setter Property="Visibility" TargetName="border" Value="Collapsed"/> 
</Trigger> 

똑같은 나는 또한 TextBox에 사용하고하고 올바르게 작동 : 나는 ListBox가 포커스를 취득했을 때에이 Border을 숨기려. TriggerListBox에서 작동하지 않는 이유는 무엇입니까?

편집 :

나는 나의 ListBoxStyle을 데 : 나는 또한 문제가 제대로 작동하기 위해 예를 받고 있고 있었다

<ControlTemplate TargetType="{x:Type local:ListBox}"> 
    <Border SnapsToDevicePixels="true" x:Name="Bd" CornerRadius="5" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" Padding="1"> 
     <Grid> 
      <local:ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}"> 
       <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
      </local:ScrollViewer> 
      <Border CornerRadius="5" Background="Red" x:Name="border"> 
       <TextBlock VerticalAlignment="Center" FontWeight="Bold" Foreground="White" 
          Text="{TemplateBinding Message}" FontFamily="Courier New" /> 
      </Border> 
     </Grid> 
    </Border> 
</DockPanel> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter Property="Visibility" TargetName="border" Value="Collapsed"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" 
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

더 많은 문맥을 제공해 주시겠습니까? 스타일 정의를 표시 할 수 있습니까? 목록 상자와 텍스트 상자에 스타일을 적용하는 방법은 무엇입니까? – Anton

+0

내 코드 질문을 업데이트했습니다. – viky

답변

0

가 업데이트되지 IsFocused 그러나 목록 상자의 적용 영역으로 이동 ListBoxItems 들어있는 ItemsPresenter을 의미한다 : 당신은 당신의 <ControlTemplate.Triggers> 컬렉션에서이 퍼팅 시도 할 수 있습니다. 이 문제에 대한 해결 방법이 있습니다. ListBox의 MouseDown 이벤트 처리기에서 Focus() 메서드를 호출합니다. IsFocused 속성을 true로 설정하고 트리거를 작동시킵니다.

5

. 당신이 ListBoxItem을 클릭하면 IsFocused 속성은 ListBox에 대해 False이 될 것이라고 결론을 내 렸습니다. 포커스가있는 것은 실제로 ListBoxItem이기 때문입니다. 아래에서 주석 처리 된 XAML 스타일이 원하는 효과를 얻으려고 시도하는 것을 볼 수 있지만 효과가 없습니다.

나는 상상 그 주석 XAML 더 개의 문항이없는 ListBox합니다 (ListBox 내부 즉 비 ListBoxItem 공백) 내 어딘가에 클릭 일 경우 것. 편집 :그냥 시도했지만 어떤 이유로 작동하지 않습니다.

그래도 효과가 있었지만 내의 모든 ListBoxItem 개 개체에 대한 스타일이 만들어졌습니다. 이 스타일은 기본적으로 EventSetters을 가지고있어 해고 될 때 MyListBox의 BorderBrush 속성을 적절하게 설정합니다.

XAML :

<ListBox Name="MyListBox" DockPanel.Dock="Top" BorderThickness="2"> 
    <!--<ListBox.Style> 
     <Style TargetType="{x:Type ListBox}"> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="BorderBrush" Value="Red"/> 
        <Setter Property="BorderThickness" Value="2"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.Style>--> 
    <ListBox.Resources> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <EventSetter Event="GotFocus" Handler="ListBoxItem_GotFocus"/> 
      <EventSetter Event="LostFocus" Handler="ListBoxItem_LostFocus"/> 
     </Style> 
    </ListBox.Resources> 
    <ListBoxItem>Item 1</ListBoxItem> 
    <ListBoxItem>Item 2</ListBoxItem> 
    <ListBoxItem>Item 3</ListBoxItem> 
    <ListBoxItem>Item 4</ListBoxItem> 
</ListBox> 

코드 숨김은 :

private void ListBoxItem_GotFocus(object sender, RoutedEventArgs e) { 
    MyListBox.BorderBrush = Brushes.Red; 
} 

private void ListBoxItem_LostFocus(object sender, RoutedEventArgs e) { 
    MyListBox.BorderBrush = Brushes.Black; 
} 

희망이 조금 도움이!

편집 : 는 내가 일을 좋아하기 때문에, (위) 내 원래의 대답에 만족하지 않았다 선언적 때 WPF에서 나는 코드 (아무 코드 숨김). 나는 GotFocusLostFocus 라우트 된 이벤트를 트리거하는 간단한 컬러 애니메이션을 사용하는 솔루션을 생각해 냈습니다.

는 여기있다 :

코딩
<ListBox Name="MyListBox" DockPanel.Dock="Top" BorderThickness="2" Height="200"> 
     <ListBox.BorderBrush> 
      <SolidColorBrush Color="Black"/> 
     </ListBox.BorderBrush> 
     <ListBox.Style> 
      <Style TargetType="{x:Type ListBox}"> 
       <Style.Resources> 
        <Storyboard x:Key="FadeBlack"> 
         <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" 
             To="Black" Duration="0:0:0.1"/> 
        </Storyboard> 
        <Storyboard x:Key="FadeRed"> 
         <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" 
             To="Red" Duration="0:0:0.1"/> 
        </Storyboard> 
       </Style.Resources> 
       <Style.Triggers> 
        <EventTrigger RoutedEvent="GotFocus"> 
         <BeginStoryboard Storyboard="{StaticResource FadeRed}"/> 
        </EventTrigger> 
        <EventTrigger RoutedEvent="LostFocus"> 
         <BeginStoryboard Storyboard="{StaticResource FadeBlack}"/> 
        </EventTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Style> 
     <ListBoxItem>Item 1</ListBoxItem> 
     <ListBoxItem>Item 2</ListBoxItem> 
     <ListBoxItem>Item 3</ListBoxItem> 
     <ListBoxItem>Item 4</ListBoxItem> 
    </ListBox> 

해피!

편집 2 : 나는 당신의 업데이트 된 코드를보고, 당신이하려고했던 것을 보았다. 이 깔끔한 애니메이션은 Lester's WPF Blog에 있습니다.초점은 목록 상자로 전환하지 않기 때문에 목록 상자를 들어

<EventTrigger RoutedEvent="ListBox.GotFocus"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="border"> 
        <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}" /> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
<EventTrigger RoutedEvent="ListBox.LostFocus"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="border"> 
       <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" /> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
+0

ListBox 용 내 Style 내에서 사용하고있는 ControlTemplate을 게시했습니다. 내 목록 상자의 문제점을 알려주십시오. – viky

+0

내 대답의 "편집 2"섹션을 참조하십시오. 희망이 도움이됩니다! – Pwninstein

+0

이 기능이 작동하지 않습니다. 어떻게 IsFocused 속성이 작동합니까? – viky

0

시도해보십시오. 작동합니다.

<Style.Triggers> 
     <EventTrigger RoutedEvent="Control.GotFocus"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.250"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Control.LostFocus"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.250"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
관련 문제