Last active
August 29, 2015 14:20
-
-
Save erodewald/be2aa4a6d2d82739b835 to your computer and use it in GitHub Desktop.
WPF CheckBox with flow direction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System.Windows; | |
using System.Windows.Controls; | |
namespace YourNamespace { | |
public class Flow { | |
public static readonly DependencyProperty DirectionProperty = DependencyProperty.RegisterAttached( | |
"Direction", typeof (FlowDirection), typeof (Flow), new PropertyMetadata(default(FlowDirection))); | |
public static void SetDirection(DependencyObject element, FlowDirection value) { | |
element.SetValue(DirectionProperty, value); | |
} | |
public static FlowDirection GetDirection(DependencyObject element) { | |
return (FlowDirection) element.GetValue(DirectionProperty); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Style x:Key="FocusVisual"> | |
<Setter Property="Control.Template"> | |
<Setter.Value> | |
<ControlTemplate> | |
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> | |
</ControlTemplate> | |
</Setter.Value> | |
</Setter> | |
</Style> | |
<SolidColorBrush x:Key="OptionMark.Static.Background" Color="#FFFFFFFF"/> | |
<SolidColorBrush x:Key="OptionMark.Static.Border" Color="#FF707070"/> | |
<Style x:Key="OptionMarkFocusVisual"> | |
<Setter Property="Control.Template"> | |
<Setter.Value> | |
<ControlTemplate> | |
<Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> | |
</ControlTemplate> | |
</Setter.Value> | |
</Setter> | |
</Style> | |
<SolidColorBrush x:Key="OptionMark.MouseOver.Background" Color="#FFF3F9FF"/> | |
<SolidColorBrush x:Key="OptionMark.MouseOver.Border" Color="#FF5593FF"/> | |
<SolidColorBrush x:Key="OptionMark.MouseOver.Glyph" Color="#FF212121"/> | |
<SolidColorBrush x:Key="OptionMark.Disabled.Background" Color="#FFE6E6E6"/> | |
<SolidColorBrush x:Key="OptionMark.Disabled.Border" Color="#FFBCBCBC"/> | |
<SolidColorBrush x:Key="OptionMark.Disabled.Glyph" Color="#FF707070"/> | |
<SolidColorBrush x:Key="OptionMark.Pressed.Background" Color="#FFD9ECFF"/> | |
<SolidColorBrush x:Key="OptionMark.Pressed.Border" Color="#FF3C77DD"/> | |
<SolidColorBrush x:Key="OptionMark.Pressed.Glyph" Color="#FF212121"/> | |
<SolidColorBrush x:Key="OptionMark.Static.Glyph" Color="#FF212121"/> | |
<Style TargetType="{x:Type CheckBox}"> | |
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/> | |
<Setter Property="Background" Value="{StaticResource OptionMark.Static.Background}"/> | |
<Setter Property="BorderBrush" Value="{StaticResource OptionMark.Static.Border}"/> | |
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> | |
<Setter Property="BorderThickness" Value="1"/> | |
<Setter Property="Template"> | |
<Setter.Value> | |
<ControlTemplate TargetType="{x:Type CheckBox}"> | |
<Grid x:Name="templateRoot" Background="Transparent" SnapsToDevicePixels="True"> | |
<Grid.ColumnDefinitions> | |
<ColumnDefinition Width="Auto"/> | |
<ColumnDefinition Width="*"/> | |
</Grid.ColumnDefinitions> | |
<Border x:Name="checkBoxBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> | |
<Grid x:Name="markGrid"> | |
<Path x:Name="optionMark" Data="F1 M 9.97498,1.22334L 4.6983,9.09834L 4.52164,9.09834L 0,5.19331L 1.27664,3.52165L 4.255,6.08833L 8.33331,1.52588e-005L 9.97498,1.22334 Z " Fill="{StaticResource OptionMark.Static.Glyph}" Margin="1" Opacity="0" Stretch="None"/> | |
<Rectangle x:Name="indeterminateMark" Fill="{StaticResource OptionMark.Static.Glyph}" Margin="2" Opacity="0"/> | |
</Grid> | |
</Border> | |
<ContentPresenter x:Name="contentPresenter" Grid.Column="1" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> | |
</Grid> | |
<ControlTemplate.Triggers> | |
<Trigger Property="local:Flow.Direction" Value="RightToLeft"> | |
<Setter Property="Grid.Column" TargetName="contentPresenter" Value="0"/> | |
<Setter Property="Grid.Column" TargetName="checkBoxBorder" Value="1"/> | |
<Setter Property="Grid.Column" TargetName="markGrid" Value="1"/> | |
</Trigger> | |
<Trigger Property="HasContent" Value="true"> | |
<Setter Property="FocusVisualStyle" Value="{StaticResource OptionMarkFocusVisual}"/> | |
<Setter Property="Padding" Value="4,-1,0,0"/> | |
</Trigger> | |
<Trigger Property="IsMouseOver" Value="true"> | |
<Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.MouseOver.Background}"/> | |
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.MouseOver.Border}"/> | |
<Setter Property="Fill" TargetName="optionMark" Value="{StaticResource OptionMark.MouseOver.Glyph}"/> | |
<Setter Property="Fill" TargetName="indeterminateMark" Value="{StaticResource OptionMark.MouseOver.Glyph}"/> | |
</Trigger> | |
<Trigger Property="IsEnabled" Value="false"> | |
<Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Disabled.Background}"/> | |
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Disabled.Border}"/> | |
<Setter Property="Fill" TargetName="optionMark" Value="{StaticResource OptionMark.Disabled.Glyph}"/> | |
<Setter Property="Fill" TargetName="indeterminateMark" Value="{StaticResource OptionMark.Disabled.Glyph}"/> | |
</Trigger> | |
<Trigger Property="IsPressed" Value="true"> | |
<Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Pressed.Background}"/> | |
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Pressed.Border}"/> | |
<Setter Property="Fill" TargetName="optionMark" Value="{StaticResource OptionMark.Pressed.Glyph}"/> | |
<Setter Property="Fill" TargetName="indeterminateMark" Value="{StaticResource OptionMark.Pressed.Glyph}"/> | |
</Trigger> | |
<Trigger Property="IsChecked" Value="true"> | |
<Setter Property="Opacity" TargetName="optionMark" Value="1"/> | |
<Setter Property="Opacity" TargetName="indeterminateMark" Value="0"/> | |
</Trigger> | |
<Trigger Property="IsChecked" Value="{x:Null}"> | |
<Setter Property="Opacity" TargetName="optionMark" Value="0"/> | |
<Setter Property="Opacity" TargetName="indeterminateMark" Value="1"/> | |
</Trigger> | |
</ControlTemplate.Triggers> | |
</ControlTemplate> | |
</Setter.Value> | |
</Setter> | |
</Style> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<CheckBox Content="Do something" /> | |
<CheckBox Content="...if this criteria is met." local:Flow.Direction="RightToLeft" /> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment