2011-10-09 116 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> 

當我運行應用程序,它掛斷和TE調試器彈出。我究竟做錯了什麼?

我已經嘗試在網格上設置觸發器,將所有內容都包裹在控件模板中,並在那裏設置觸發器,同樣的問題!

編輯

我試圖創造一個按鈕,只觸發的代碼會導致未處理的異常錯誤。

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

調試說什麼彈出? – Tigran

+0

它說未處理的Microsoft .NET異常發生 – SpeedBirdNine

回答

2

您需要使用DataTrigger,並設置兩個面板的樣式屬性的複選框的屬性格式器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> 
+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,這裏是你可以做什麼:

創建一個轉換器

根控制的資源
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:命名您的切換按鈕;可以說你稱之爲「MyToggleButton」

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

並且爲SPanel2做一些非常相似的事情。

+0

沒有運氣,即使我完全刪除了setter標記,它也不起作用。 – SpeedBirdNine

+0

參閱編輯。更多信息 – SpeedBirdNine

+1

我編輯了我的回覆 –

相關問題