2011-01-02 8 views
0

스타일 TabItem에해야 있도록의 RadioButton을 템플릿 수있는 방법이 있나요.
물론 RadioButtons를 선호하지만 내 고객은 탭이어야한다고 주장합니다.나는 시도했다가

+0

그 안에 몇 개의 TabItem이있는 TabControl을 사용하지 않을 이유가 있다면? –

+0

사촌 내 콘텐츠를 템플릿으로 선언하고 싶지는 않지만 각 탭마다 동일한 콘텐츠를 원합니다. – Shimmy

답변

1

제가 생각하기에 문제는 TabItem이 mouseclick을 "먹고"있어 RadioButton이 절대로 선택/선택 해제되지 않는다고 생각합니다. 테두리에 TabItem을 래핑하고 IsHitTestVisible="False"을 설정할 수 있습니다. 이

<LinearGradientBrush x:Key="TabItemHotBackground" EndPoint="0,1" StartPoint="0,0"> 
    <GradientStop Color="#EAF6FD" Offset="0.15"/> 
    <GradientStop Color="#D9F0FC" Offset=".5"/> 
    <GradientStop Color="#BEE6FD" Offset=".5"/> 
    <GradientStop Color="#A7D9F5" Offset="1"/> 
</LinearGradientBrush> 
<SolidColorBrush x:Key="TabItemSelectedBackground" Color="#F9F9F9"/> 
<SolidColorBrush x:Key="TabItemHotBorderBrush" Color="#3C7FB1"/> 

<Style x:Key="RadioButtonStyle1" TargetType="{x:Type RadioButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="RadioButton"> 
       <Border BorderBrush="Transparent" BorderThickness="0" Background="Transparent" CornerRadius="0"> 
        <TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}" IsHitTestVisible="False"> 
         <TabItem.Header> 
          <ContentPresenter Margin="5"/> 
         </TabItem.Header> 
        </TabItem> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Background" TargetName="tabItem" Value="{StaticResource TabItemHotBackground}"/> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="true"> 
         <Setter Property="Panel.ZIndex" Value="1"/> 
         <Setter Property="Background" TargetName="tabItem" Value="{StaticResource TabItemSelectedBackground}"/> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" Value="false"/> 
          <Condition Property="IsMouseOver" Value="true"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="BorderBrush" TargetName="tabItem" Value="{StaticResource TabItemHotBorderBrush}"/> 
        </MultiTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

업데이트

<ControlTemplate TargetType="RadioButton"> 
    <Border BorderBrush="Transparent" BorderThickness="0" Background="Transparent" CornerRadius="0"> 
     <TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}" IsHitTestVisible="False"> 
      <TabItem.Header> 
       <ContentPresenter Margin="5"/> 
      </TabItem.Header> 
     </TabItem> 
    </Border> 
</ControlTemplate> 
같은 시도 기본 템플릿

에서 무언가를 다시 추가해야합니다 있도록이 이렇게 당신은, 등등 IsMouseOver 트리거를 잃게됩니다


업데이트 2
연결된 동작을 사용하여 TabItem을 클릭 할 때 RadioButton에서 MouseDown 이벤트를 발생시킬 수 있습니다. 또는 당신은 단지 대신 클릭 이벤트

<ControlTemplate TargetType="RadioButton"> 
    <TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}" 
      local:LinkWithRadioButtonBehavior.LinkWithRadioButton="True"> 
     <TabItem.Header> 
      <ContentPresenter Margin="5"/> 
     </TabItem.Header> 
    </TabItem> 
</ControlTemplate> 

LinkWithRadioButtonBehavior

public static class LinkWithRadioButtonBehavior 
{ 
    public static readonly DependencyProperty LinkWithRadioButtonProperty = 
     DependencyProperty.RegisterAttached 
     (
      "LinkWithRadioButton", 
      typeof(bool), 
      typeof(LinkWithRadioButtonBehavior), 
      new UIPropertyMetadata(false, OnLinkWithRadioButtonPropertyChanged) 
     ); 
    public static bool GetLinkWithRadioButton(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(LinkWithRadioButtonProperty); 
    } 
    public static void SetLinkWithRadioButton(DependencyObject obj, bool value) 
    { 
     obj.SetValue(LinkWithRadioButtonProperty, value); 
    } 
    private static void OnLinkWithRadioButtonPropertyChanged(DependencyObject dpo, 
                  DependencyPropertyChangedEventArgs e) 
    { 
     Control control = dpo as Control; 
     if (control != null) 
     { 
      if ((bool)e.NewValue == true) 
      { 
       control.PreviewMouseDown += OnMouseDown; 
      } 
      else 
      { 
       control.PreviewMouseDown -= OnMouseDown; 
      } 
     } 
    } 
    static void OnMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     Control control = sender as Control; 
     MouseButtonEventArgs routedEventArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left); 
     routedEventArgs.RoutedEvent = RadioButton.MouseDownEvent; 
     routedEventArgs.Source = control; 
     RadioButton clickedRadioButton = GetVisualParent<RadioButton>(control); 
     clickedRadioButton.RaiseEvent(routedEventArgs); 
    } 
    public static T GetVisualParent<T>(object childObject) where T : Visual 
    { 
     DependencyObject child = childObject as DependencyObject; 
     while ((child != null) && !(child is T)) 
     { 
      child = VisualTreeHelper.GetParent(child); 
     } 
     return child as T; 
    } 
} 
+0

하지만'RadioButton'이'TabItem.IsSelected'를 업데이트 할 수없는 이유는 내부 'TabItem'의'IsSelected' 트리거를 트리거 할 수 없기 때문입니다. – Shimmy

+0

나는 혼합 표현식에서 하드 코드 된 복사 - 붙여 넣기를 피하려고합니다. 나는 그것이 가능한 적은 템플리트를 포함 시키길 원한다. – Shimmy

+0

@Shimmy : RadioButton 자체가 마우스 클릭을 수신하지 않으므로 IsChecked를 업데이트 할 시간이 없다는 것을 모릅니다. 트리거를 제거 할 수 있지만 TabItem의 IsMouseOver 효과는 없습니다 –

0

그냥 ToggleButtons으로 라디오 버튼의 스타일과 할당 상호 배타적 인 상태를 만들 수 양육의 IsChecked = "true"로 설정 수 "클릭"이벤트 블렌드 상호 작용 트리거. 그것은 고통이지만, 당신이 받아 들인 대답보다 훨씬 적습니다. 그것이 누군가를 돕기를 바란다.