2011-03-09 4 views

답변

0

심지어는 일반 마크 업에서 그 일을 할 수 있다면, 그것은 아마도 더 나은 연결된 동작을 사용하는 것이 저를 회신 해 주시기 바랍니다. 여기에 예제 :

class Toggle 
    { 
     Expander target; 
     public Toggle(Expander src,Expander target) 
     { 
      this.target = target; 
      src.Collapsed += new RoutedEventHandler(src_Collapsed); 
      src.Expanded += new RoutedEventHandler(src_Expanded); 
     } 

     void src_Expanded(object sender, RoutedEventArgs e) 
     { 
      target.IsExpanded = false; 
     } 

     void src_Collapsed(object sender, RoutedEventArgs e) 
     { 
      target.IsExpanded = true; 
     } 
    } 
    public static class ToggleExpanderBehavior 
    { 

     static List<Toggle> toggler = new List<Toggle>(); 
     public static Expander GetTargetExpander(DependencyObject obj) 
     { 
      return (Expander)obj.GetValue(TargetExpanderProperty); 
     } 

     public static void SetTargetExpander(DependencyObject obj, string value) 
     { 
      obj.SetValue(TargetExpanderProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for TargetName. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty TargetExpanderProperty = 
      DependencyProperty.RegisterAttached("TargetExpander", typeof(Expander), typeof(ToggleExpanderBehavior), new UIPropertyMetadata(null,new PropertyChangedCallback(OnTargetChanged))); 

     static void OnTargetChanged(DependencyObject depo, DependencyPropertyChangedEventArgs depa) 
     { 
      if (depa.NewValue!=null) 
      { 
       if (depo is Expander) 
       { 
        var exp = depo as Expander; 
        toggler.Add(new Toggle(exp,depa.NewValue as Expander)); 
       } 
      } 
     } 




    } 

당신 반은 다음과 같이 XAML에서이 동작을 첨부 :

<Expander x:Name="X" IsExpanded="True" local:ToggleExpanderBehavior.TargetExpander="{Binding ElementName=Y}" > 
      <TextBlock>Content 1</TextBlock> 
     </Expander> 
     <Expander x:Name="Y" IsExpanded="False" local:ToggleExpanderBehavior.TargetExpander="{Binding ElementName=X}"> 

      <TextBlock>Content 2</TextBlock> 
     </Expander> 
    </StackPanel> 

당신은에 토글 있습니다.

+0

하이 Pollano 덕분에 . 7 호선 없습니다. –

+0

xaml에 로컬 네임 스페이스를 추가해야합니다. 즉, 창 d를 봅니다. eclaration, 모든 네임 스페이스를 찾고 다음을 추가합니다. xmlns : local = "clr-namespace : ThenamespacecontainingtheclassIconvided" –

+0

Fine :) 작동합니다 Gud Thanks Pollano :) –

0

도움이 될 수 있습니다 : 모든 확장 프로그램 항목 (모두 동일한 이벤트)에 확장 이벤트를 등록하십시오. 하나 열 경우, 다른 모든 폐쇄 :

private void expander_Expanded(object sender, RoutedEventArgs e) 
    { 
     SPExpander.Children.OfType<Expander>() 
      .All<Expander>(expander => 
      { 
       if ((Expander)sender != expander) 
        expander.IsExpanded = false; 
       else 
        expander.IsExpanded = true; 

       return true; 
      }); 
    } 

희망이 당신에게 문제를 해결 ...

0

난 그냥 다른에으로 IsExpanded 속성에 하나 개의 확장의으로 IsExpanded 속성을 바인딩 것, 당신에게 단지 값을 반전 값 변환기를 제공 할 필요가

public class BoolInverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var b = value as bool?; 
     return !b; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var b = value as bool?; 
     return !b; 
    } 
} 
, 위치 49 'XML이 유효 게시 그러나 당신은'지역 '선언되지 않은 네임 스페이스를 오류 :(주는 코딩
관련 문제