WPF Trigger не работает, что я делаю не так? - PullRequest
1 голос
/ 09 октября 2011

У меня есть следующий код (только соответствующие фрагменты)

<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>

И для второй 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>

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Вам необходимо использовать DataTrigger и установить свойство style двух панелей для свойства IsChecked флажка, здесь пример

        <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>
1 голос
/ 09 октября 2011

UIElement.IsVisible не является изменяемым свойством.Вам нужно установить UIElement.Visibility, который является перечислением.

Причина, по которой вы получаете исключение, заключается в том, что FrameworkElement.Triggers принимает только EventTrigger.Это означает, что если вы выполняете UIElement.Triggers (Button.Triggers или ribbon: RibbonToggleButton.Triggers), вы можете добавлять только EventTriggers под него.Style, DataTemplate и ControlTemplate принимают все производные классы TriggerBase.

Редактировать

Как указывал Макхо, вы не можете использовать TargetName в разделе Стиль.Вы должны выполнить это, используя привязку данных.

Предполагая, что SPanel1 является StackPanel, вот что вы можете сделать:

Создать конвертер

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

Где-то вресурсы корневого элемента управления, добавьте BoolToVisibilityConverter

Добавьте x: Name к вашей кнопке переключения;Допустим, вы называете это «MyToggleButton»

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

И делаете что-то очень похожее для SPanel2.

...