2011-10-09 4 views
1

는 다음 코드 (에만 관련 조각)WPF 트리거가 작동하지 않습니다. 무엇을 잘못하고 있습니까?

<ribbon:RibbonWindow .............> 
    <Grid> 
     <ribbon:Ribbon> 
      <ribbon:RibbonToggleButton 
        x:Name="Button2" 
        SmallImageSource="Images\SmallIcon.png" 
        Label="Properties"> 
        <ribbon:RibbonToggleButton.Triggers> 
         <Trigger Property="ToggleButton.IsChecked" Value="True"> 
          <Setter TargetName="SPanel1" Property="UIElement.IsVisible" Value="False"/> 
          <Setter TargetName="SPanel2" Property="UIElement.IsVisible" Value="True"/> 

         </Trigger> 
        </ribbon:RibbonToggleButton.Triggers> 

      </ribbon:RibbonToggleButton> 


     </ribbon:Ribbon> 
    </Grid> 

</ribbon:RibbonWindow> 

이 그리고 내가 응용 프로그램을 실행할 때, 그것은 끊고 테 디버거가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

컨트롤 템플릿의 모든 것을 래핑하고 거기에 트리거를 설정하면 동일한 문제가있는 표에 트리거를 설정해 보았습니다!

편집

나는 버튼을 만드는 시도 및 트리거의 태그는 처리되지 않은 예외 오류가 발생합니다. 데이터 트리거를 사용하여

<Button Content="Button" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="12,27,0,0" Name="TestButton" VerticalAlignment="Top" Width="75" > 
     <Button.Triggers> 
      <Trigger></Trigger> 
     </Button.Triggers> 
</Button> 

편집 2

가 처리되지 않은 예외가 멀리 갈 수 있지만, 트리거가 응답하지 않습니다

<StackPanel.Style> 
       <Style TargetType="StackPanel"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=Button2, Path=ToggleButton.IsChecked}" Value="True"> 
          <Setter Property="UIElement.Visibility" Value="Hidden"></Setter> 
         </DataTrigger> 

        </Style.Triggers> 
       </Style> 
      </StackPanel.Style> 

편집 3

<ribbon:RibbonToggleButton 
       x:Name="Button2" 
       SmallImageSource="Images\SmallIcon.png" 
       Label="Properties"> 

</ribbon:RibbonToggleButton> 

그리고 패널은

<StackPanel     
     Grid.Row="2"     
     Grid.Column="1"      
     x:Name="SPanel1" 
     Visibility="Visible">       
     <Label>*Deafult Grid*</Label> 
<StackPanel.Style>       
    <Style TargetType="StackPanel">        
      <Style.Triggers>         
       <DataTrigger Binding="{Binding ElementName=Button2, Path=ToggleButton.IsChecked}" Value="True">          
       <Setter Property="UIElement.Visibility" Value="Hidden"></Setter>                 
       </DataTrigger>         
      </Style.Triggers>        
    </Style> 
       </StackPanel.Style> 
</StackPanel> 

을 숨길 수 및 제 2의 StackPanel을 위해 내가

<StackPanel 
    Grid.Row="2" 
    Grid.Column="1" 
    x:Name="SPanel2" 
    Visibility="Hidden"> 
     <Label>*Panel 2 *</Label> 
     <StackPanel.Style> 
      <Style TargetType="StackPanel"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Button2, Path=IsChecked}" Value="True"> 
        <Setter Property="UIElement.Visibility" Value="Visible"></Setter> 
        </DataTrigger> 

       </Style.Triggers> 
      </Style> 
     </StackPanel.Style> 
</StackPanel> 
+0

디버거가 무슨 말하여 팝업? – Tigran

+0

처리되지 않은 Microsoft .NET 예외가 발생했습니다. – SpeedBirdNine

답변

2
당신은 체크 박스의의 IsChecked 때에 프로퍼티, 예를 들어 여기에 DataTrigger를 사용하고 두 개의 패널의 스타일 속성을 설정해야합니다

 <CheckBox Name="check" Content="Prova" IsChecked="True"> </CheckBox> 

     <Canvas Name="SPanel1" Background="Blue" Width="100" Height="100"> 
      <Canvas.Style> 
       <Style TargetType="Canvas"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=check, Path=IsChecked}" Value="True"> 
          <Setter Property="Visibility" Value="Hidden"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Canvas.Style> 
     </Canvas> 
+0

솔루션에서 오류를 제거했지만 트리거가 응답하지 않습니다. 편집 2를 참조하십시오 – SpeedBirdNine

+0

제가 게시 한 코드를 직접 테스트했으며 확실하게 작동합니다. 뭔가 놓칠 수도 있습니다. 코드의 모든 부분을 게시하십시오. – MaRuf

+0

완료! 편집 3을 참조하십시오 – SpeedBirdNine

1

UIElement.IsVisible가 변경 가능한 속성이 아닙니다입니다 보여주고 싶은 것을. 열거 형인 UIElement.Visibility를 설정해야합니다.

FrameworkElement.Triggers는 EventTrigger 만 허용하기 때문에 예외가 발생하는 이유가 있습니다. 즉, UIElement.Triggers (Button.Triggers 또는 ribbon : RibbonToggleButton.Triggers)를 수행하면 그 아래에서 EventTriggers 만 추가 할 수 있습니다. Style, DataTemplate 및 ControlTemplate은 모든 TriggerBase 파생 클래스를 허용합니다. Mackho는 지적

편집

, 당신은 스타일에서 targetName을 사용할 수 없습니다. 데이터 바인딩을 사용하여이 작업을 수행해야합니다.

는 SPanel1는 StackPanel의입니다 가정, 여기 당신이 할 수있는 작업은 다음과 같습니다

이 BoolToVisibilityConverter를 추가, 컨버터 루트 컨트롤의 자원 어딘가

public class BoolToVisibilityConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

만들기

추가 x :는 전환에 이름을 단추; "MyToggleButton"이라고 말하도록합니다.

<StackPanel x:Name="SPanel1" ... 
      Visibility="{Binding IsChecked, ElementName=MyToggleButton, Converter={StaticResource BoolToVisibilityConverter}}" /> 

그리고 SPanel2와 매우 유사한 작업을 수행하십시오.

+0

행운을 내지 않습니다. setter 태그를 완전히 제거하더라도 작동하지 않습니다. – SpeedBirdNine

+0

편집을 참조하십시오. More info – SpeedBirdNine

+1

내 응답을 편집했습니다 –

관련 문제