13 changed files with 530 additions and 19 deletions
@ -0,0 +1,68 @@ |
|||||||
|
// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
// software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
// substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||||
|
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Media; |
||||||
|
|
||||||
|
namespace ICSharpCode.WpfDesign.Designer.Controls |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// A ComboBox wich is Nullable
|
||||||
|
/// </summary>
|
||||||
|
public class NullableComboBox : ComboBox |
||||||
|
{ |
||||||
|
static NullableComboBox() |
||||||
|
{ |
||||||
|
DefaultStyleKeyProperty.OverrideMetadata(typeof(NullableComboBox), new FrameworkPropertyMetadata(typeof(NullableComboBox))); |
||||||
|
} |
||||||
|
|
||||||
|
public override void OnApplyTemplate() |
||||||
|
{ |
||||||
|
base.OnApplyTemplate(); |
||||||
|
|
||||||
|
var btn = GetTemplateChild("PART_ClearButton") as Button; |
||||||
|
|
||||||
|
btn.Click += btn_Click; |
||||||
|
} |
||||||
|
|
||||||
|
void btn_Click(object sender, RoutedEventArgs e) |
||||||
|
{ |
||||||
|
var clearButton = (Button)sender; |
||||||
|
var parent = VisualTreeHelper.GetParent(clearButton); |
||||||
|
|
||||||
|
while (!(parent is ComboBox)) |
||||||
|
{ |
||||||
|
parent = VisualTreeHelper.GetParent(parent); |
||||||
|
} |
||||||
|
|
||||||
|
var comboBox = (ComboBox)parent; |
||||||
|
comboBox.SelectedIndex = -1; |
||||||
|
} |
||||||
|
|
||||||
|
public bool IsNullable |
||||||
|
{ |
||||||
|
get { return (bool)GetValue(IsNullableProperty); } |
||||||
|
set { SetValue(IsNullableProperty, value); } |
||||||
|
} |
||||||
|
|
||||||
|
public static readonly DependencyProperty IsNullableProperty = |
||||||
|
DependencyProperty.Register("IsNullable", typeof(bool), typeof(NullableComboBox), new PropertyMetadata(true)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,249 @@ |
|||||||
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||||
|
xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" |
||||||
|
xmlns:local="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls" |
||||||
|
xmlns:converters="clr-namespace:ICSharpCode.WpfDesign.Designer.Converters"> |
||||||
|
|
||||||
|
<converters:CollapsedWhenFalse x:Key="TrueVisibleConverter" /> |
||||||
|
|
||||||
|
<Style x:Key="ClearSelectionButtonStyle" TargetType="Button"> |
||||||
|
<Setter Property="Background" Value="#FF3C688D"/> |
||||||
|
<Setter Property="BorderBrush" Value="#FF617584"/> |
||||||
|
<Setter Property="BorderThickness" Value="1"/> |
||||||
|
<Setter Property="Width" Value="15"/> |
||||||
|
<Setter Property="Height" Value="15"/> |
||||||
|
<Setter Property="Padding" Value="0"/> |
||||||
|
<Setter Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate TargetType="Button"> |
||||||
|
<Grid Background="Transparent"> |
||||||
|
<VisualStateManager.VisualStateGroups> |
||||||
|
<VisualStateGroup x:Name="CommonStates"> |
||||||
|
<VisualState x:Name="Normal"/> |
||||||
|
<VisualState x:Name="MouseOver"> |
||||||
|
<Storyboard> |
||||||
|
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="MouseOverElement"> |
||||||
|
<DiscreteObjectKeyFrame KeyTime="0"> |
||||||
|
<DiscreteObjectKeyFrame.Value> |
||||||
|
<Visibility>Visible</Visibility> |
||||||
|
</DiscreteObjectKeyFrame.Value> |
||||||
|
</DiscreteObjectKeyFrame> |
||||||
|
</ObjectAnimationUsingKeyFrames> |
||||||
|
</Storyboard> |
||||||
|
</VisualState> |
||||||
|
<VisualState x:Name="Pressed"> |
||||||
|
<Storyboard> |
||||||
|
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="MouseOverElement"> |
||||||
|
<DiscreteObjectKeyFrame KeyTime="0"> |
||||||
|
<DiscreteObjectKeyFrame.Value> |
||||||
|
<Visibility>Visible</Visibility> |
||||||
|
</DiscreteObjectKeyFrame.Value> |
||||||
|
</DiscreteObjectKeyFrame> |
||||||
|
</ObjectAnimationUsingKeyFrames> |
||||||
|
</Storyboard> |
||||||
|
</VisualState> |
||||||
|
<VisualState x:Name="Disabled"/> |
||||||
|
</VisualStateGroup> |
||||||
|
<VisualStateGroup x:Name="FocusStates"> |
||||||
|
<VisualState x:Name="Focused"/> |
||||||
|
<VisualState x:Name="Unfocused"/> |
||||||
|
</VisualStateGroup> |
||||||
|
</VisualStateManager.VisualStateGroups> |
||||||
|
<Border x:Name="MouseOverElement" BorderThickness="{TemplateBinding BorderThickness}" Background="#FFC8E4ED" BorderBrush="#FF3F6A8E" Visibility="Collapsed"/> |
||||||
|
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="Center" Margin="{TemplateBinding Padding}" VerticalAlignment="Center"/> |
||||||
|
</Grid> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
|
||||||
|
<Style x:Key="ComboBoxFocusVisual"> |
||||||
|
<Setter Property="Control.Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate> |
||||||
|
<Rectangle Margin="4,4,21,4" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0"> |
||||||
|
<GradientStop Color="#F3F3F3" Offset="0"/> |
||||||
|
<GradientStop Color="#EBEBEB" Offset="0.5"/> |
||||||
|
<GradientStop Color="#DDDDDD" Offset="0.5"/> |
||||||
|
<GradientStop Color="#CDCDCD" Offset="1"/> |
||||||
|
</LinearGradientBrush> |
||||||
|
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/> |
||||||
|
<Geometry x:Key="DownArrowGeometry">M 0 0 L 3.5 4 L 7 0 Z</Geometry> |
||||||
|
<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}"> |
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/> |
||||||
|
<Setter Property="IsTabStop" Value="false"/> |
||||||
|
<Setter Property="Focusable" Value="false"/> |
||||||
|
<Setter Property="ClickMode" Value="Press"/> |
||||||
|
<Setter Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate TargetType="{x:Type ToggleButton}"> |
||||||
|
<Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="true"> |
||||||
|
<Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"> |
||||||
|
<Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/> |
||||||
|
</Grid> |
||||||
|
</Themes:ButtonChrome> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger Property="IsChecked" Value="true"> |
||||||
|
<Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsEnabled" Value="false"> |
||||||
|
<Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<LinearGradientBrush x:Key="TextBoxBorder" EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0"> |
||||||
|
<GradientStop Color="#ABADB3" Offset="0.05"/> |
||||||
|
<GradientStop Color="#E2E3EA" Offset="0.07"/> |
||||||
|
<GradientStop Color="#E3E9EF" Offset="1"/> |
||||||
|
</LinearGradientBrush> |
||||||
|
<Style x:Key="ComboBoxEditableTextBox" TargetType="{x:Type TextBox}"> |
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/> |
||||||
|
<Setter Property="AllowDrop" Value="true"/> |
||||||
|
<Setter Property="MinWidth" Value="0"/> |
||||||
|
<Setter Property="MinHeight" Value="0"/> |
||||||
|
<Setter Property="FocusVisualStyle" Value="{x:Null}"/> |
||||||
|
<Setter Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate TargetType="{x:Type TextBox}"> |
||||||
|
<ScrollViewer x:Name="PART_ContentHost" Background="Transparent" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<Style x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}"> |
||||||
|
<Setter Property="OverridesDefaultStyle" Value="true"/> |
||||||
|
<Setter Property="IsTabStop" Value="false"/> |
||||||
|
<Setter Property="Focusable" Value="false"/> |
||||||
|
<Setter Property="ClickMode" Value="Press"/> |
||||||
|
<Setter Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate TargetType="{x:Type ToggleButton}"> |
||||||
|
<Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RoundCorners="false" SnapsToDevicePixels="true" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"> |
||||||
|
<Path x:Name="Arrow" Data="{StaticResource DownArrowGeometry}" Fill="Black" HorizontalAlignment="Center" Margin="0,1,0,0" VerticalAlignment="Center"/> |
||||||
|
</Themes:ButtonChrome> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger Property="IsChecked" Value="true"> |
||||||
|
<Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsEnabled" Value="false"> |
||||||
|
<Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}"> |
||||||
|
<Grid x:Name="Placement" SnapsToDevicePixels="true"> |
||||||
|
<Grid.ColumnDefinitions> |
||||||
|
<ColumnDefinition Width="*"/> |
||||||
|
<ColumnDefinition Width="Auto"/> |
||||||
|
</Grid.ColumnDefinitions> |
||||||
|
<Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom"> |
||||||
|
<Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=Placement}"> |
||||||
|
<Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"> |
||||||
|
<ScrollViewer> |
||||||
|
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> |
||||||
|
</ScrollViewer> |
||||||
|
</Border> |
||||||
|
</Themes:SystemDropShadowChrome> |
||||||
|
</Popup> |
||||||
|
<Themes:ListBoxChrome x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"/> |
||||||
|
<TextBox x:Name="PART_EditableTextBox" Margin="3,3,23,3" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxEditableTextBox}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/> |
||||||
|
<ToggleButton Grid.Column="1" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/> |
||||||
|
</Grid> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger Property="IsKeyboardFocusWithin" Value="true"> |
||||||
|
<Setter Property="Foreground" Value="Black"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsDropDownOpen" Value="true"> |
||||||
|
<Setter Property="RenderFocused" TargetName="Border" Value="true"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="HasItems" Value="false"> |
||||||
|
<Setter Property="Height" TargetName="DropDownBorder" Value="95"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsEnabled" Value="false"> |
||||||
|
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> |
||||||
|
<Setter Property="Background" Value="#FFF4F4F4"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsGrouping" Value="true"> |
||||||
|
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true"> |
||||||
|
<Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/> |
||||||
|
<Setter Property="Color" TargetName="Shdw" Value="#71000000"/> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
|
||||||
|
<Style TargetType="{x:Type local:NullableComboBox}"> |
||||||
|
<Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"/> |
||||||
|
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> |
||||||
|
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> |
||||||
|
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> |
||||||
|
<Setter Property="BorderThickness" Value="1"/> |
||||||
|
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> |
||||||
|
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> |
||||||
|
<Setter Property="VerticalContentAlignment" Value="Center" /> |
||||||
|
<Setter Property="Padding" Value="4,3"/> |
||||||
|
<Setter Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate TargetType="{x:Type local:NullableComboBox}"> |
||||||
|
<Grid x:Name="MainGrid" SnapsToDevicePixels="true"> |
||||||
|
<Grid.ColumnDefinitions> |
||||||
|
<ColumnDefinition Width="*"/> |
||||||
|
<ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/> |
||||||
|
</Grid.ColumnDefinitions> |
||||||
|
<Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom"> |
||||||
|
<Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}"> |
||||||
|
<Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"> |
||||||
|
<ScrollViewer CanContentScroll="true"> |
||||||
|
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> |
||||||
|
</ScrollViewer> |
||||||
|
</Border> |
||||||
|
</Themes:SystemDropShadowChrome> |
||||||
|
</Popup> |
||||||
|
<ToggleButton BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxReadonlyToggleButton}"/> |
||||||
|
<ContentPresenter ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="3,3,18,3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> |
||||||
|
<Button Style="{StaticResource ClearSelectionButtonStyle}" x:Name="PART_ClearButton" Visibility="{Binding IsNullable, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource TrueVisibleConverter}}" HorizontalAlignment="Right" Margin="0,0,0,0"> |
||||||
|
<Path Data="M0,0 L1.6,0 L3,1.56 L4.4,0 L6,0 L3.8,2.5 L6,5 L4.4,5 L3,3.49 L1.59,5 L-4.2E-09,5 L2.18,2.5 z" Fill="#CC111111" Height="5" Stretch="Fill" Width="7"/> |
||||||
|
</Button> |
||||||
|
</Grid> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true"> |
||||||
|
<Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/> |
||||||
|
<Setter Property="Color" TargetName="Shdw" Value="#71000000"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="HasItems" Value="false"> |
||||||
|
<Setter Property="Height" TargetName="DropDownBorder" Value="95"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsEnabled" Value="false"> |
||||||
|
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> |
||||||
|
<Setter Property="Background" Value="#FFF4F4F4"/> |
||||||
|
</Trigger> |
||||||
|
<Trigger Property="IsGrouping" Value="true"> |
||||||
|
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
<Style.Triggers> |
||||||
|
<Trigger Property="IsEditable" Value="true"> |
||||||
|
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/> |
||||||
|
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> |
||||||
|
<Setter Property="IsTabStop" Value="false"/> |
||||||
|
<Setter Property="Padding" Value="3"/> |
||||||
|
<Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}"/> |
||||||
|
</Trigger> |
||||||
|
</Style.Triggers> |
||||||
|
</Style> |
||||||
|
</ResourceDictionary> |
@ -0,0 +1,151 @@ |
|||||||
|
// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
// software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
// substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||||
|
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Globalization; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Data; |
||||||
|
using System.Windows.Markup; |
||||||
|
using ICSharpCode.WpfDesign.UIExtensions; |
||||||
|
|
||||||
|
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "ICSharpCode.WpfDesign.Designer.MarkupExtensions")] |
||||||
|
|
||||||
|
|
||||||
|
namespace ICSharpCode.WpfDesign.Designer.MarkupExtensions |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// A Binding to a DesignItem of Object
|
||||||
|
///
|
||||||
|
/// This can be used for Example your own Property Pages for Designer Objects
|
||||||
|
/// </summary>
|
||||||
|
public class DesignItemBinding : MarkupExtension |
||||||
|
{ |
||||||
|
private string _propertyName; |
||||||
|
private Binding _binding; |
||||||
|
private DesignItemSetConverter _converter; |
||||||
|
private DependencyProperty _targetProperty; |
||||||
|
private FrameworkElement _targetObject; |
||||||
|
|
||||||
|
public bool SingleItemProperty { get; set; } |
||||||
|
|
||||||
|
public UpdateSourceTrigger UpdateSourceTrigger { get; set; } |
||||||
|
|
||||||
|
public DesignItemBinding(string path) |
||||||
|
{ |
||||||
|
this._propertyName = path; |
||||||
|
|
||||||
|
UpdateSourceTrigger = UpdateSourceTrigger.Default; |
||||||
|
} |
||||||
|
|
||||||
|
public override object ProvideValue(IServiceProvider serviceProvider) |
||||||
|
{ |
||||||
|
IProvideValueTarget service = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); |
||||||
|
_targetObject = service.TargetObject as FrameworkElement; |
||||||
|
_targetProperty = service.TargetProperty as DependencyProperty; |
||||||
|
|
||||||
|
_targetObject.DataContextChanged += targetObject_DataContextChanged; |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
void targetObject_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) |
||||||
|
{ |
||||||
|
var ctx = ((FrameworkElement) sender).DataContext as FrameworkElement; |
||||||
|
|
||||||
|
var surface = ctx.TryFindParent<DesignSurface>(); |
||||||
|
|
||||||
|
if (surface != null) |
||||||
|
{ |
||||||
|
_binding = new Binding(_propertyName); |
||||||
|
_binding.Source = ctx; |
||||||
|
_binding.UpdateSourceTrigger = UpdateSourceTrigger; |
||||||
|
_binding.Mode = BindingMode.TwoWay; |
||||||
|
|
||||||
|
var designItem = surface.DesignContext.Services.Component.GetDesignItem(ctx); |
||||||
|
|
||||||
|
_converter = new DesignItemSetConverter(designItem, _propertyName, SingleItemProperty); |
||||||
|
_binding.Converter = _converter; |
||||||
|
|
||||||
|
_targetObject.SetBinding(_targetProperty, _binding); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
_targetObject.ClearValue(_targetProperty); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private class DesignItemSetConverter : IValueConverter |
||||||
|
{ |
||||||
|
private DesignItem _designItem; |
||||||
|
private string _property; |
||||||
|
private bool _singleItemProperty; |
||||||
|
|
||||||
|
public DesignItemSetConverter(DesignItem desigItem, string property, bool singleItemProperty) |
||||||
|
{ |
||||||
|
this._designItem = desigItem; |
||||||
|
this._property = property; |
||||||
|
this._singleItemProperty = singleItemProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) |
||||||
|
{ |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) |
||||||
|
{ |
||||||
|
var changeGroup = _designItem.OpenGroup("Property: " + _property); |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
var property = _designItem.Properties.GetProperty(_property); |
||||||
|
|
||||||
|
property.SetValue(value); |
||||||
|
|
||||||
|
|
||||||
|
if (!_singleItemProperty && _designItem.Services.Selection.SelectedItems.Count > 1) |
||||||
|
{ |
||||||
|
var msg = MessageBox.Show("Apply changes to all selected Items","", MessageBoxButton.YesNo); |
||||||
|
if (msg == MessageBoxResult.Yes) |
||||||
|
{ |
||||||
|
foreach (var item in _designItem.Services.Selection.SelectedItems) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
property = item.Properties.GetProperty(_property); |
||||||
|
} |
||||||
|
catch(Exception) |
||||||
|
{ } |
||||||
|
if (property != null) |
||||||
|
property.SetValue(value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
changeGroup.Commit(); |
||||||
|
} |
||||||
|
catch (Exception) |
||||||
|
{ |
||||||
|
changeGroup.Abort(); |
||||||
|
} |
||||||
|
|
||||||
|
return value; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -1,15 +1,17 @@ |
|||||||
<ComboBox |
<local:NullableComboBox |
||||||
x:Class="ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.ComboBoxEditor" |
x:Class="ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.ComboBoxEditor" |
||||||
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation" |
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation" |
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||||
BorderThickness="0" |
xmlns:local="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls" |
||||||
SelectedItem="{Binding Value}" |
BorderThickness="0" |
||||||
Background="{x:Null}" |
SelectedItem="{Binding Value}" |
||||||
Focusable="False" |
Background="{x:Null}" |
||||||
> |
Focusable="False" |
||||||
<ComboBox.ItemsPanel> |
IsNullable="False" |
||||||
<ItemsPanelTemplate> |
> |
||||||
<VirtualizingStackPanel /> |
<local:NullableComboBox.ItemsPanel> |
||||||
</ItemsPanelTemplate> |
<ItemsPanelTemplate> |
||||||
</ComboBox.ItemsPanel> |
<VirtualizingStackPanel /> |
||||||
</ComboBox> |
</ItemsPanelTemplate> |
||||||
|
</local:NullableComboBox.ItemsPanel> |
||||||
|
</local:NullableComboBox> |
||||||
|
Loading…
Reference in new issue