Browse Source

Add ToggleSplitButton

pull/7422/head
robloo 5 years ago
parent
commit
29865672e2
  1. 57
      samples/ControlCatalog/Pages/SplitButtonPage.xaml
  2. 145
      src/Avalonia.Controls/SplitButton/SplitButton.cs
  3. 25
      src/Avalonia.Controls/SplitButton/SplitButtonClickEventArgs.cs
  4. 147
      src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs
  5. 215
      src/Avalonia.Themes.Fluent/Controls/SplitButton.xaml

57
samples/ControlCatalog/Pages/SplitButtonPage.xaml

@ -1,37 +1,40 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.SplitButtonPage">
<UserControl.Resources>
<MenuFlyout x:Key="SharedMenuFlyout"
Placement="Bottom">
<MenuItem Header="Item 1">
<MenuItem Header="Subitem 1" />
<MenuItem Header="Subitem 2" />
<MenuItem Header="Subitem 3" />
</MenuItem>
<MenuItem Header="Item 2"
InputGesture="Ctrl+A" />
<MenuItem Header="Item 3" />
</MenuFlyout>
</UserControl.Resources>
<StackPanel Orientation="Vertical" Spacing="4">
<SplitButton>
<SplitButton Flyout="{StaticResource SharedMenuFlyout}">
<TextBlock Text="Content" />
<SplitButton.Flyout>
<MenuFlyout>
<MenuItem Header="Item 1">
<MenuItem Header="Subitem 1" />
<MenuItem Header="Subitem 2" />
<MenuItem Header="Subitem 3" />
</MenuItem>
<MenuItem Header="Item 2"
InputGesture="Ctrl+A" />
<MenuItem Header="Item 3" />
</MenuFlyout>
</SplitButton.Flyout>
</SplitButton>
<SplitButton
IsEnabled="False">
<SplitButton IsEnabled="False"
Flyout="{StaticResource SharedMenuFlyout}">
<TextBlock Text="Content" />
<SplitButton.Flyout>
<MenuFlyout>
<MenuItem Header="Item 1">
<MenuItem Header="Subitem 1" />
<MenuItem Header="Subitem 2" />
<MenuItem Header="Subitem 3" />
</MenuItem>
<MenuItem Header="Item 2"
InputGesture="Ctrl+A" />
<MenuItem Header="Item 3" />
</MenuFlyout>
</SplitButton.Flyout>
</SplitButton>
<ToggleSplitButton Flyout="{StaticResource SharedMenuFlyout}">
<TextBlock Text="Content" />
</ToggleSplitButton>
<ToggleSplitButton IsChecked="True"
Flyout="{StaticResource SharedMenuFlyout}">
<TextBlock Text="Content" />
</ToggleSplitButton>
<ToggleSplitButton IsChecked="True"
IsEnabled="False"
Flyout="{StaticResource SharedMenuFlyout}">
<TextBlock Text="Content" />
</ToggleSplitButton>
</StackPanel>
</UserControl>

145
src/Avalonia.Controls/SplitButton/SplitButton.cs

@ -1,6 +1,7 @@
using System;
using System.Reactive.Disposables;
using System.Windows.Input;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Input;
using Avalonia.Interactivity;
@ -9,16 +10,32 @@ using Avalonia.LogicalTree;
namespace Avalonia.Controls
{
/// <summary>
/// A button with primary and secondary parts that can each be invoked separately.
/// The primary part behaves like a button and the secondary part opens a flyout.
/// A button with primary and secondary parts that can each be pressed separately.
/// The primary part behaves like a <see cref="Button"/> and the secondary part opens a flyout.
/// </summary>
//[PseudoClasses(":pressed")]
[PseudoClasses(
":disabled",
":secondaryButtonRight",
":secondaryButtonSpan",
":checkedFlyoutOpen",
":flyoutOpen",
":checkedTouchPressed",
":checked",
":checkedPrimaryPressed",
":checkedPrimaryPointerOver",
":checkedSecondaryPressed",
":checkedSecondaryPointerOver",
":touchPressed",
":primaryPressed",
":primaryPointerOver",
":secondaryPressed",
":secondaryPointerOver")]
public class SplitButton : ContentControl, ICommandSource
{
/// <summary>
/// Raised when the user presses the primary part of the <see cref="SplitButton"/>.
/// </summary>
public event EventHandler<SplitButtonClickEventArgs> Click
public event EventHandler<RoutedEventArgs> Click
{
add => AddHandler(ClickEvent, value);
remove => RemoveHandler(ClickEvent, value);
@ -27,8 +44,8 @@ namespace Avalonia.Controls
/// <summary>
/// Defines the <see cref="Click"/> event.
/// </summary>
public static readonly RoutedEvent<SplitButtonClickEventArgs> ClickEvent =
RoutedEvent.Register<SplitButton, SplitButtonClickEventArgs>(
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
RoutedEvent.Register<SplitButton, RoutedEventArgs>(
nameof(Click),
RoutingStrategies.Bubble);
@ -61,11 +78,12 @@ namespace Avalonia.Controls
private Button _primaryButton = null;
private Button _secondaryButton = null;
private bool _commandCanExecute = true;
protected bool _hasLoaded = false;
private bool _isFlyoutOpen = false;
private bool _isKeyDown = false;
private PointerType _lastPointerType = PointerType.Mouse;
private bool _commandCanExecute = true;
protected bool _hasLoaded = false;
private bool _isAttachedToLogicalTree = false;
private bool _isFlyoutOpen = false;
private bool _isKeyDown = false;
private PointerType _lastPointerType = PointerType.Mouse;
private CompositeDisposable _buttonPropertyChangedDisposable;
private IDisposable _flyoutPropertyChangedDisposable;
@ -116,6 +134,19 @@ namespace Avalonia.Controls
set => SetValue(FlyoutProperty, value);
}
/// <summary>
/// Gets a value indicating whether the button is currently checked.
/// </summary>
/// <remarks>
/// This property exists only for the derived <see cref="ToggleSplitButton"/> and is
/// unused (set to false) within <see cref="SplitButton"/>. Doing this allows the
/// two controls to share a default style.
/// </remarks>
internal virtual bool InternalIsChecked => false;
/// <inheritdoc/>
protected override bool IsEnabledCore => base.IsEnabledCore && _commandCanExecute;
////////////////////////////////////////////////////////////////////////
//
// Methods
@ -134,17 +165,12 @@ namespace Avalonia.Controls
}
}
/// <inheritdoc/>
protected override bool IsEnabledCore => base.IsEnabledCore && _commandCanExecute;
/// <summary>
/// Updates the visual state of the control by applying latest PseudoClasses.
/// </summary>
private void UpdatePseudoClasses()
protected void UpdatePseudoClasses()
{
bool internalIsChecked = false;
string pcNormal = ":normal";
string pcNormal = ":normal"; // Not supported in XAML style
string pcDisabled = ":disabled";
string pcSecondaryButtonRight = ":secondaryButtonRight";
@ -189,7 +215,7 @@ namespace Avalonia.Controls
{
if (_isFlyoutOpen)
{
if (internalIsChecked)
if (InternalIsChecked)
{
SetExclusivePseudoClass(pcCheckedFlyoutOpen);
}
@ -199,7 +225,7 @@ namespace Avalonia.Controls
}
}
// SplitButton and ToggleSplitButton share a template -- this section is driving the checked states for ToggleSplitButton.
else if (internalIsChecked)
else if (InternalIsChecked)
{
if (_lastPointerType == PointerType.Touch || _isKeyDown)
{
@ -273,23 +299,23 @@ namespace Avalonia.Controls
// This more closely matches the VisualStateManager of WinUI where the default style originated
void SetExclusivePseudoClass(string pseudoClass = "")
{
PseudoClasses.Set(pcNormal, pseudoClass == pcNormal);
PseudoClasses.Set(pcNormal, pseudoClass == pcNormal);
PseudoClasses.Set(pcDisabled, pseudoClass == pcDisabled);
PseudoClasses.Set(pcCheckedFlyoutOpen, pseudoClass == pcCheckedFlyoutOpen);
PseudoClasses.Set(pcFlyoutOpen, pseudoClass == pcFlyoutOpen);
PseudoClasses.Set(pcFlyoutOpen, pseudoClass == pcFlyoutOpen);
PseudoClasses.Set(pcCheckedTouchPressed, pseudoClass == pcCheckedTouchPressed);
PseudoClasses.Set(pcChecked, pseudoClass == pcChecked);
PseudoClasses.Set(pcCheckedPrimaryPressed, pseudoClass == pcCheckedPrimaryPressed);
PseudoClasses.Set(pcCheckedPrimaryPointerOver, pseudoClass == pcCheckedPrimaryPointerOver);
PseudoClasses.Set(pcCheckedSecondaryPressed, pseudoClass == pcCheckedSecondaryPressed);
PseudoClasses.Set(pcCheckedTouchPressed, pseudoClass == pcCheckedTouchPressed);
PseudoClasses.Set(pcChecked, pseudoClass == pcChecked);
PseudoClasses.Set(pcCheckedPrimaryPressed, pseudoClass == pcCheckedPrimaryPressed);
PseudoClasses.Set(pcCheckedPrimaryPointerOver, pseudoClass == pcCheckedPrimaryPointerOver);
PseudoClasses.Set(pcCheckedSecondaryPressed, pseudoClass == pcCheckedSecondaryPressed);
PseudoClasses.Set(pcCheckedSecondaryPointerOver, pseudoClass == pcCheckedSecondaryPointerOver);
PseudoClasses.Set(pcTouchPressed, pseudoClass == pcTouchPressed);
PseudoClasses.Set(pcPrimaryPressed, pseudoClass == pcPrimaryPressed);
PseudoClasses.Set(pcPrimaryPointerOver, pseudoClass == pcPrimaryPointerOver);
PseudoClasses.Set(pcSecondaryPressed, pseudoClass == pcSecondaryPressed);
PseudoClasses.Set(pcTouchPressed, pseudoClass == pcTouchPressed);
PseudoClasses.Set(pcPrimaryPressed, pseudoClass == pcPrimaryPressed);
PseudoClasses.Set(pcPrimaryPointerOver, pseudoClass == pcPrimaryPointerOver);
PseudoClasses.Set(pcSecondaryPressed, pseudoClass == pcSecondaryPressed);
PseudoClasses.Set(pcSecondaryPointerOver, pseudoClass == pcSecondaryPointerOver);
}
}
@ -297,7 +323,7 @@ namespace Avalonia.Controls
/// <summary>
/// Opens the secondary button's flyout.
/// </summary>
private void OpenFlyout()
protected void OpenFlyout()
{
if (Flyout != null)
{
@ -308,7 +334,7 @@ namespace Avalonia.Controls
/// <summary>
/// Closes the secondary button's flyout.
/// </summary>
private void CloseFlyout()
protected void CloseFlyout()
{
if (Flyout != null)
{
@ -447,26 +473,63 @@ namespace Avalonia.Controls
protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
{
base.OnAttachedToLogicalTree(e);
if (Command != null)
{
Command.CanExecuteChanged += CanExecuteChanged;
CanExecuteChanged(this, EventArgs.Empty);
}
_isAttachedToLogicalTree = true;
}
/// <inheritdoc/>
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
{
base.OnDetachedFromLogicalTree(e);
if (Command != null)
{
Command.CanExecuteChanged -= CanExecuteChanged;
}
_isAttachedToLogicalTree = false;
}
/// <inheritdoc/>
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> changedEventArgs)
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> e)
{
if (changedEventArgs.Property == FlyoutProperty)
if (e.Property == CommandProperty)
{
if (_isAttachedToLogicalTree)
{
// Must unregister events here while a reference to the old command still exists
if (e.OldValue is ICommand oldCommand)
{
oldCommand.CanExecuteChanged -= CanExecuteChanged;
}
if (e.NewValue is ICommand newCommand)
{
newCommand.CanExecuteChanged += CanExecuteChanged;
}
}
CanExecuteChanged(this, EventArgs.Empty);
}
else if (e.Property == CommandParameterProperty)
{
CanExecuteChanged(this, EventArgs.Empty);
}
else if (e.Property == FlyoutProperty)
{
// Must unregister events here while a ref to the old flyout still exists
if (changedEventArgs.OldValue.GetValueOrDefault() is FlyoutBase oldFlyout)
// Must unregister events here while a reference to the old flyout still exists
if (e.OldValue.GetValueOrDefault() is FlyoutBase oldFlyout)
{
UnregisterFlyoutEvents(oldFlyout);
}
if (changedEventArgs.NewValue.GetValueOrDefault() is FlyoutBase newFlyout)
if (e.NewValue.GetValueOrDefault() is FlyoutBase newFlyout)
{
RegisterFlyoutEvents(newFlyout);
}
@ -474,7 +537,7 @@ namespace Avalonia.Controls
UpdatePseudoClasses();
}
base.OnPropertyChanged(changedEventArgs);
base.OnPropertyChanged(e);
}
/// <inheritdoc/>
@ -526,7 +589,7 @@ namespace Avalonia.Controls
}
/// <summary>
/// Invokes the <see cref="Click"/> when the primary button part is clicked.
/// Invokes the <see cref="Click"/> event when the primary button part is clicked.
/// </summary>
/// <param name="e">The event args from the internal Click event.</param>
protected virtual void OnClickPrimary(RoutedEventArgs e)
@ -534,7 +597,7 @@ namespace Avalonia.Controls
// Note: It is not currently required to check enabled status; however, this is a failsafe
if (IsEffectivelyEnabled)
{
var eventArgs = new SplitButtonClickEventArgs(ClickEvent);
var eventArgs = new RoutedEventArgs(ClickEvent);
RaiseEvent(eventArgs);
if (!eventArgs.Handled && Command?.CanExecute(CommandParameter) == true)

25
src/Avalonia.Controls/SplitButton/SplitButtonClickEventArgs.cs

@ -1,25 +0,0 @@
using Avalonia.Interactivity;
namespace Avalonia.Controls
{
/// <summary>
/// Provides event data for the <see cref="SplitButton.Click"/> event.
/// </summary>
public class SplitButtonClickEventArgs : RoutedEventArgs
{
public SplitButtonClickEventArgs()
{
}
public SplitButtonClickEventArgs(RoutedEvent? routedEvent)
{
RoutedEvent = routedEvent;
}
public SplitButtonClickEventArgs(RoutedEvent? routedEvent, IInteractive? source)
{
RoutedEvent = routedEvent;
Source = source;
}
}
}

147
src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs

@ -0,0 +1,147 @@
using System;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Interactivity;
using Avalonia.Styling;
namespace Avalonia.Controls
{
/// <summary>
/// A button with primary and secondary parts that can each be pressed separately.
/// The primary part behaves like a <see cref="ToggleButton"/> with two states and
/// the secondary part opens a flyout.
/// </summary>
[PseudoClasses(
":disabled",
":secondaryButtonRight",
":secondaryButtonSpan",
":checkedFlyoutOpen",
":flyoutOpen",
":checkedTouchPressed",
":checked",
":checkedPrimaryPressed",
":checkedPrimaryPointerOver",
":checkedSecondaryPressed",
":checkedSecondaryPointerOver",
":touchPressed",
":primaryPressed",
":primaryPointerOver",
":secondaryPressed",
":secondaryPointerOver")]
public class ToggleSplitButton : SplitButton, IStyleable
{
/// <summary>
/// Raised when the <see cref="IsChecked"/> property value changes.
/// </summary>
public event EventHandler<RoutedEventArgs> IsCheckedChanged
{
add => AddHandler(IsCheckedChangedEvent, value);
remove => RemoveHandler(IsCheckedChangedEvent, value);
}
/// <summary>
/// Defines the <see cref="IsCheckedChanged"/> event.
/// </summary>
public static readonly RoutedEvent<RoutedEventArgs> IsCheckedChangedEvent =
RoutedEvent.Register<ToggleSplitButton, RoutedEventArgs>(
nameof(IsCheckedChanged),
RoutingStrategies.Bubble);
/// <summary>
/// Defines the <see cref="IsChecked"/> property.
/// </summary>
public static readonly StyledProperty<bool> IsCheckedProperty =
AvaloniaProperty.Register<ToggleSplitButton, bool>(
nameof(IsChecked));
////////////////////////////////////////////////////////////////////////
//
// Constructor / Destructors
//
////////////////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a new instance of the <see cref="ToggleSplitButton"/> class.
/// </summary>
public ToggleSplitButton()
{
}
////////////////////////////////////////////////////////////////////////
//
// Properties
//
////////////////////////////////////////////////////////////////////////
/// <summary>
/// Gets or sets a value indicating whether the <see cref="ToggleSplitButton"/> is checked.
/// </summary>
public bool IsChecked
{
get => GetValue(IsCheckedProperty);
set => SetValue(IsCheckedProperty, value);
}
/// <inheritdoc/>
internal override bool InternalIsChecked => IsChecked;
/// <inheritdoc/>
/// <remarks>
/// Both <see cref="ToggleSplitButton"/> and <see cref="SplitButton"/> share
/// the same exact default style.
/// </remarks>
Type IStyleable.StyleKey => typeof(SplitButton);
////////////////////////////////////////////////////////////////////////
//
// Methods
//
////////////////////////////////////////////////////////////////////////
/// <summary>
/// Toggles the <see cref="IsChecked"/> property between true and false.
/// </summary>
protected void Toggle()
{
IsChecked = !IsChecked;
}
////////////////////////////////////////////////////////////////////////
//
// OnEvent Overridable Methods
//
////////////////////////////////////////////////////////////////////////
/// <inheritdoc/>
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> e)
{
if (e.Property == IsCheckedProperty)
{
OnIsCheckedChanged();
}
}
/// <summary>
/// Invokes the <see cref="IsCheckedChanged"/> event when the <see cref="IsChecked"/>
/// property changes.
/// </summary>
protected virtual void OnIsCheckedChanged()
{
if (_hasLoaded)
{
var eventArgs = new RoutedEventArgs(IsCheckedChangedEvent);
RaiseEvent(eventArgs);
}
UpdatePseudoClasses();
}
/// <inheritdoc/>
protected override void OnClickPrimary(RoutedEventArgs e)
{
Toggle();
base.OnClickPrimary(e);
}
}
}

215
src/Avalonia.Themes.Fluent/Controls/SplitButton.xaml

@ -235,124 +235,127 @@
</Style>
<!-- Checked State -->
<!--<VisualState x:Name="Checked">
<VisualState.Setters>
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushChecked}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checked /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checked /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checked /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushChecked}" />
</Style>
<Style Selector="SplitButton:checked /template/ Button#PrimaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<Style Selector="SplitButton:checked /template/ Button#SecondaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<!-- CheckedFlyoutOpen State -->
<!--<VisualState x:Name="CheckedFlyoutOpen">
<VisualState.Setters>
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedFlyoutOpen /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedFlyoutOpen /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedFlyoutOpen /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedFlyoutOpen /template/ Button#PrimaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedFlyoutOpen /template/ Button#SecondaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<!-- CheckedTouchPressed State -->
<!--<VisualState x:Name="CheckedTouchPressed">
<VisualState.Setters>
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedTouchPressed /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedTouchPressed /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedTouchPressed /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedTouchPressed /template/ Button#PrimaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedTouchPressed /template/ Button#SecondaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<!-- CheckedPrimaryPointerOver State -->
<!--<VisualState x:Name="CheckedPrimaryPointerOver">
<VisualState.Setters>
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushChecked}" />
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPointerOver}" />
<Setter Target="PrimaryButton.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPointerOver}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPointerOver}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedPrimaryPointerOver /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushChecked}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPointerOver /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPointerOver}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPointerOver /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPointerOver /template/ Button#PrimaryButton">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPointerOver}" />
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPointerOver}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPointerOver /template/ Button#SecondaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<!-- CheckedPrimaryPressed State -->
<!--<VisualState x:Name="CheckedPrimaryPressed">
<VisualState.Setters>
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushChecked}" />
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="PrimaryButton.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedPrimaryPressed /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushChecked}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPressed /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPressed /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPressed /template/ Button#PrimaryButton">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedPrimaryPressed /template/ Button#SecondaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<!-- CheckedSecondaryPointerOver State -->
<!--<VisualState x:Name="CheckedSecondaryPointerOver">
<VisualState.Setters>
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushChecked}" />
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPointerOver}" />
<Setter Target="SecondaryButton.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPointerOver}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPointerOver}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedSecondaryPointerOver /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPointerOver /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPointerOver /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPointerOver}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPointerOver /template/ Button#PrimaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPointerOver /template/ Button#SecondaryButton">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPointerOver}" />
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPointerOver}" />
</Style>
<!-- CheckedSecondaryPressed State -->
<!--<VisualState x:Name="CheckedSecondaryPressed">
<VisualState.Setters>
<Setter Target="Border.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushChecked}" />
<Setter Target="PrimaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundChecked}" />
<Setter Target="PrimaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundChecked}" />
<Setter Target="SecondaryBackgroundRectangle.Fill"
Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
<Setter Target="SecondaryButton.BorderBrush"
Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Target="SecondaryButton.Foreground"
Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</VisualState.Setters>
</VisualState>-->
<Style Selector="SplitButton:checkedSecondaryPressed /template/ Border#Border">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPressed /template/ Rectangle#PrimaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPressed /template/ Rectangle#SecondaryBackgroundRectangle">
<Setter Property="Fill" Value="{DynamicResource SplitButtonBackgroundCheckedPressed}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPressed /template/ Button#PrimaryButton">
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundChecked}" />
</Style>
<Style Selector="SplitButton:checkedSecondaryPressed /template/ Button#SecondaryButton">
<Setter Property="BorderBrush" Value="{DynamicResource SplitButtonBorderBrushCheckedPressed}" />
<Setter Property="Foreground" Value="{DynamicResource SplitButtonForegroundCheckedPressed}" />
</Style>
<!--VisualStateGroup x:Name="SecondaryButtonPlacementStates">
<VisualState x:Name="SecondaryButtonRight" />

Loading…
Cancel
Save