스타일 TabItem에해야 있도록의 RadioButton을 템플릿 수있는 방법이 있나요.
물론 RadioButtons를 선호하지만 내 고객은 탭이어야한다고 주장합니다.나는 시도했다가
나는 시도했다가
답변
제가 생각하기에 문제는 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;
}
}
하지만'RadioButton'이'TabItem.IsSelected'를 업데이트 할 수없는 이유는 내부 'TabItem'의'IsSelected' 트리거를 트리거 할 수 없기 때문입니다. – Shimmy
나는 혼합 표현식에서 하드 코드 된 복사 - 붙여 넣기를 피하려고합니다. 나는 그것이 가능한 적은 템플리트를 포함 시키길 원한다. – Shimmy
@Shimmy : RadioButton 자체가 마우스 클릭을 수신하지 않으므로 IsChecked를 업데이트 할 시간이 없다는 것을 모릅니다. 트리거를 제거 할 수 있지만 TabItem의 IsMouseOver 효과는 없습니다 –
그냥 ToggleButtons으로 라디오 버튼의 스타일과 할당 상호 배타적 인 상태를 만들 수 양육의 IsChecked = "true"로 설정 수 "클릭"이벤트 블렌드 상호 작용 트리거. 그것은 고통이지만, 당신이 받아 들인 대답보다 훨씬 적습니다. 그것이 누군가를 돕기를 바란다.
그 안에 몇 개의 TabItem이있는 TabControl을 사용하지 않을 이유가 있다면? –
사촌 내 콘텐츠를 템플릿으로 선언하고 싶지는 않지만 각 탭마다 동일한 콘텐츠를 원합니다. – Shimmy