2011-01-02 17 views
0

Stil TabItem sollte ich versucht habe:Gibt es eine Möglichkeit, einen Radiobutton Vorlage, so dass es

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

Es funktioniert tatsächlich außer es nicht/deaktivieren Sie das entsprechende Register auswählt.
Ich würde RadioButtons natürlich bevorzugen, aber mein Kunde besteht darauf, dass es Tabs sein sollte.

+0

Jeder Grund, warum Sie nicht nur ein TabControl mit ein paar TabItems darin verwenden würden? –

+0

Weil ich meinen Inhalt nicht in einer Vorlage deklarieren will, sondern den gleichen Inhalt für jede Registerkarte. – Shimmy

Antwort

1

Ich denke das Problem ist, dass das TabItem den Mausklick "isst", so dass der RadioButton nie aktiviert/deaktiviert wird. Sie könnten das TabItem in einen Rahmen einbinden und IsHitTestVisible="False" setzen. Dadurch erhalten Sie den IsMouseOver Trigger usw. verlieren, so dass Sie sie von der Standardvorlage erneut hinzugefügt werden müssen

Versuchen Sie so etwas wie diese

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

aktualisiert

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

Update 2
Sie können ein Attached Behavior verwenden, um das MouseDown-Ereignis im RadioButton auszulösen, wenn auf das TabItem geklickt wird. Alternativ könnte man einfach IsChecked = „True“ statt Erhöhung der Click-Ereignis

<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

Aber warum kann der 'RadioButton' das 'TabItem.IsSelected' nicht aktualisieren und dies wird den Trigger' IsSelected' des internen' TabItem' auslösen? – Shimmy

+0

Ich versuche Hardcoded Copy-Paste Templates aus Expression Blend zu vermeiden. Ich möchte, dass weniger Templates möglich sind. – Shimmy

+0

@Shimmy: Der RadioButton selbst erhält niemals den Mausklick, also hat er keine Ahnung, dass es Zeit ist, IsChecked zu aktualisieren. Sie können die Trigger entfernen, aber dann haben Sie nicht den IsMouseOver-Effekt für TabItem –

0

Sie könnten nur die Auswahlknöpfe als ToggleButtons Stil und schaffen sich gegenseitig ausschließende Zustände der zugewiesene gesetzt "Click" Ereignis Blend Interaktion Trigger. Es ist ein Schmerz, aber viel weniger als die Antwort, die du angenommen hast. Hoffe, es hilft jemandem

Verwandte Themen