2011-01-02 2 views
0

Я пробовал:Есть ли способ шаблона RadioButton поэтому он должен TabItem стиля

<UniformGrid DockPanel.Dock="Top" Columns="2" Rows="1"> 
    <UniformGrid.Resources> 
    <Style TargetType="RadioButton"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="RadioButton"> 
      <TabItem IsSelected="{TemplateBinding IsChecked}"> 
       <TabItem.Header> 
       <ContentPresenter Margin="5" /> 
       </TabItem.Header>     
      </TabItem> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </UniformGrid.Resources> 
    <RadioButton Content="By company name" /> 
    <RadioButton Content="By contact name" Grid.Column="1"/> 
</UniformGrid> 

Это на самом деле работает, кроме него не выбирает/отменив соответствующую вкладку.
Я бы предпочел RadioButtons, конечно, но мой клиент настаивает, что это должны быть вкладки.

+0

По какой-то причине вы не просто используете TabControl с парой TabItems внутри него? –

+0

Cuz Я не хочу объявлять свой контент в шаблоне, вместо этого хочу получить тот же контент для каждой вкладки. – Shimmy

ответ

1

Я думаю, проблема заключается в том, что TabItem «ест» музлик, поэтому RadioButton никогда не проверяется/не проверяется. Вы можете обернуть TabItem в Border и установить IsHitTestVisible="False". Делая это, вы будете терять курок IsMouseOver и т.д., так что вам придется повторно добавить их из шаблона по умолчанию

Попробуйте что-то вроде этого

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

Update

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

Обновление 2
Вы можете использовать Attached Behavior, чтобы поднять событие MouseDown на RadioButton при нажатии на TabItem. В качестве альтернативы можно просто установить IsChecked = «True» вместо того, чтобы поднять клик-событие

<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', и это вызовет триггер' IsSelected' 'TabItem'? – Shimmy

+0

Я стараюсь избегать жестко скопированных шаблонов вставки из выражения blend. Я хочу, чтобы он включал в себя меньше шаблонов. – Shimmy

+0

@Shimmy: сам RadioButton никогда не получает щелчок мыши, поэтому он не знает, что пришло время обновить IsChecked. Вы можете удалить триггеры, но тогда у вас не будет эффекта IsMouseOver для TabItem. –

0

Вы можете просто стиль в радиокнопках, как ToggleButtons и создать взаимоисключающие присвоенные Событие Blend Interaction Triggers «Click». Это боль, но гораздо меньше, чем ответ, который вы приняли. Надеюсь, что это поможет кому-то.

Смежные вопросы