2016-08-17 1 views
0

스타일 트리거가있는 간단한 ToggleButton을 사용하여 IsChecked의 상태에 따라 단추의 이미지를 변경할 수 있습니다. 버튼 하나로 잘 작동합니다. 그러나 하나 이상의 단추를 표에 추가 할 때 ToggleButton 중 하나를 클릭하면 다른 단추의 상태가 변경됩니다. botton의 스타일을 기반으로하는 트리거 유형 대신 다른 트리거 유형을 사용해야합니까? 여기 WPF ToggleButton을 클릭하면 다른 ToggleButtons 값이 변경됩니다.

세 ToggleButtons 배치하는 XAML 블록입니다 :

<Grid Height="362" Width="259"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True" 
       Width="15" Height="15" Grid.Row="0" Grid.Column="0"/> 
     <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True" 
       Width="15" Height="15" Grid.Row="1" Grid.Column="0"/> 
     <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True" 
       Width="15" Height="15" Grid.Row="2" Grid.Column="0"/> 
    </Grid> 

을 그리고 여기 트리거와 스타일입니다 :이 부르는 것

<Style x:Key="TogglebuttonStyle" TargetType="ToggleButton"> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <Image Source="{StaticResource ImagePlus}"/> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="False"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <Image Source="{StaticResource ImageMinus}"/> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="{x:Null}"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <Image Source="{StaticResource ImageNeutral}"/> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

각 버튼은 자체 상태를 유지합니다.

App.xaml (태그 내)에서 내 스타일 블록을 이동하고 각 버튼에 스타일 트리거를 정의하면 문제가 사라졌습니다. 이후로 나는 WPF/XAML에 대해 상당히 익숙하지 않기 때문에 실제 솔루션인지 또는 해킹 가능한 해결 방법인지 확실하지 않습니다. 이런 식으로 지정하는 것은 무리가 있습니다.

<ToggleButton IsChecked="True" IsThreeState="True" 
      Width="25" Height="25" Grid.Row="2" Margin="-1,19,1,-19"> 
    <ToggleButton.Style> 
     <Style TargetType="ToggleButton"> 
      <Style.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <Image Source="{StaticResource ImagePlus}"/> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
       <Trigger Property="IsChecked" Value="False"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <Image Source="{StaticResource ImageMinus}"/> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
       <Trigger Property="IsChecked" Value="{x:Null}"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <Image Source="{StaticResource ImageNeutral}"/> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 
+1

내가 게시 한 예제 코드를 시도했는데 예상대로 작동합니다. 각 버튼은 개별적으로 변경됩니다. –

+0

아직 문제가 해결되지 않았지만 하나의 작은 데이터 포인트로 토글 버튼의 ​​내용을 일반 텍스트 ("on", "off", "n/a")로 변경했습니다. 세 개의 버튼은 모두 독립적으로 작동하며 자체 상태를 유지합니다. –

답변

1

문제는 세터는 하나의 부모를 가질 수 Image 컨트롤의 인스턴스를 인스턴스화한다는 것입니다. 그런 다음 버튼이 "ImagePlus"상태가되면 모두 잘됩니다. 두 번째 버튼이 해당 상태로 들어가면 컨트롤이 새 부모로 이동하고 이전 자식은 떠나지 않은 채로 Image 컨트롤이 이동합니다.

이것은 XAML에 템플릿이있는 이유 중 하나입니다. 템플릿이 인스턴스화되면 해당 시각적 트리 조각의 새 인스턴스가 인스턴스화됩니다. Presto, 공유 문제는 없습니다.

일부 리소스를 사용하면 리소스에 x:Shared="False"을 설정하고이 문제를 해결할 수 있습니다. 나는 여기서 그 일을 할 수있는 길을 찾지 못했습니다. (나는 그 일이 언제 이루어지는 것인지, 언제 그렇지 않을 것인지에 대한 정확한 원리를 이해하는 데 아직 익숙하지 않았습니다.) 그래서 내가 대신 DataTemplates로했다 :

<Style x:Key="TogglebuttonStyle" TargetType="ToggleButton" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
    <Style.Triggers> 
     <Trigger Property="IsChecked" Value="True"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Image Source="{StaticResource ImagePlus}" /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="IsChecked" Value="False"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Image Source="{StaticResource ImageMinus}" /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="IsChecked" Value="{x:Null}"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Image Source="{StaticResource ImageNeutral}" /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

도움과 설명에 감사드립니다! –

1

좀 더 연구를하고 후, 나는 스타일이 공유되지 않도록 지정했다 발견했다.

<Style x:Key="ToggleButtonStyle" x:Shared="False" /Style> 
관련 문제