2016-09-23 6 views
1

블렌드 트리거를 사용하여 예를 들어 스타일을 변경하려면 xaml 만 사용할 수 있습니까? 예를 들어 이벤트 을 실행 한 후 RadioButton 변경 등록 정보 VisibilityFirstStyleVisible으로 지정하십시오.WPF 블렌드를 사용하여 스타일 변경

<Window x:Class="switch_style.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:Interactions="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="FirstStyle" TargetType="Label" x:Name="block"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto"></RowDefinition> 
       <RowDefinition Height="auto"></RowDefinition> 
       <RowDefinition Height="auto"></RowDefinition> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal"> 
       <Label Style="{DynamicResource FirstStyle}">First</Label> 
       <Label>Second</Label> 
       <Label>Third</Label> 
      </StackPanel> 
      <StackPanel Grid.Row="2" Orientation="Vertical"> 
       <RadioButton Width="60" HorizontalAlignment="Left" Content="First"> 
        <Interactivity:Interaction.Triggers> 
         <Interactivity:EventTrigger EventName="Checked"> 
          <Interactions:ChangePropertyAction TargetName="{Binding block}" PropertyName="Visibility" Value="Visible"/> 
         </Interactivity:EventTrigger> 
        </Interactivity:Interaction.Triggers> 
       </RadioButton> 
       <RadioButton Width="60" HorizontalAlignment="Left">Second</RadioButton> 
       <RadioButton Width="60" HorizontalAlignment="Left">Third</RadioButton> 
      </StackPanel> 
     </Grid> 
    </Grid> 
</Window> 
+0

RadioButton의 선택 여부에 따라 레이블을 표시/숨김으로 설정하려는 경우 Label의 가시성을 RadioButton IsChecked 속성에 직접 바인딩하지 않는 이유는 무엇입니까? – sthotakura

+0

@sthotakura, 아마도 좋은 생각입니다. 만약 내가 하나의 스타일을 사용해야하고 그 안에 내가 버튼의 속성을 확인 레이블의 가시성을 바인딩해야합니다. 하지만 어떻게 바인딩 바인딩 값 = {바인딩 ...} 컨트롤 속성 스타일로? – A191919

+0

흠 .. 그건 까다 롭습니다. 내 대답을 참조하십시오. – sthotakura

답변

1

Style 목적은 그것이 Control에인가되는 모멘트 불변된다. 이 Style이 아직 적용되지 않은 경우 변경할 수 있습니다.

그러므로 두 개의 Styles을 별도로 만들고 Trigger을 기반으로 Style을 선택해야합니다.

1

XAML에서만 수행하려는 이유가 너무 많으므로 여기서는 제 시도이며 작동합니다.

<Style x:Key="FirstStyle" TargetType="Label"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 

을 그리고, 나는 해당 RadioButton들에 Label들에 DataContext을 설정

나는 다음에 당신의 스타일을 업데이트했습니다. 여기에 전체 XAML입니다 :

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
     <Style x:Key="FirstStyle" TargetType="Label"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Page.Resources> 
    <Grid> 
     <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 
     <StackPanel Orientation="Horizontal"> 
      <Label Content="First" DataContext="{Binding ElementName=radioButton1}" Style="{DynamicResource FirstStyle}"/> 
      <Label Content="Second" DataContext="{Binding ElementName=radioButton2}" Style="{DynamicResource FirstStyle}"/> 
      <Label Content="Third" DataContext="{Binding ElementName=radioButton3}" Style="{DynamicResource FirstStyle}"/> 
     </StackPanel> 
     <StackPanel Grid.Row="2" Orientation="Vertical"> 
      <RadioButton 
       x:Name="radioButton1" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="First"/> 
      <RadioButton 
       x:Name="radioButton2" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="Second"/> 
      <RadioButton 
       x:Name="radioButton3" 
       Width="60" 
       HorizontalAlignment="Left" 
       Content="Third"/> 
     </StackPanel> 
     </Grid> 
    </Grid> 
</Page> 

우리는 백업 뷰 모델에 동일한 속성에 RadioButtonIsCheckedLabel의 가시성을 결합 할 수 있다면 그것은 아마 더 쉬웠을 것이다.

이 문제에 대한 또 다른 접근 방법은 @ AnjumSKhan의 대답입니다.