Labeled ContentControl & LabeledControl【项目】
LabeledTextBoxControl:
C#定义 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; namespace Halliburton.Castor.Controls { class LabeledTextBoxControl : Control { public static readonly DependencyProperty LabelProperty; public static readonly DependencyProperty TextProperty; public static readonly DependencyProperty MaxLengthProperty; static LabeledTextBoxControl() { Type ownerType = typeof(LabeledTextBoxControl); //FrameworkPropertyMetadata defaultStyleKeyMetadata = new FrameworkPropertyMetadata(); //defaultStyleKeyMetadata.DefaultValue = ownerType; //DefaultStyleKeyProperty.OverrideMetadata(ownerType, defaultStyleKeyMetadata); FrameworkPropertyMetadata labelMetadata = new FrameworkPropertyMetadata(default(String), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault); LabelProperty = DependencyProperty.Register("Label", typeof(string), ownerType, labelMetadata); FrameworkPropertyMetadata textMetadata = new FrameworkPropertyMetadata(default(String), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault); TextProperty = DependencyProperty.Register("Text", typeof(string), ownerType, textMetadata); FrameworkPropertyMetadata maxLengthMetadata = new FrameworkPropertyMetadata(); MaxLengthProperty = DependencyProperty.Register("MaxLength", typeof(int), ownerType, maxLengthMetadata); } public string Label { get { return (string)GetValue(LabelProperty); } set { SetValue(LabelProperty, value); } } public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public int MaxLength { get { return (int)GetValue(MaxLengthProperty); } set { SetValue(MaxLengthProperty, value); } } } }
Template定义:
<Style x:Key="LabeledTextBoxControl_Style" TargetType="{x:Type controls:LabeledTextBoxControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type controls:LabeledTextBoxControl}"> <Grid MaxHeight="30" VerticalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock x:Name="Label" Grid.Column="0" VerticalAlignment="Center" FontSize="9pt" FontWeight="Normal" Foreground="#FF221F1F" Style="{StaticResource Univers57_Condensed}" Text="{TemplateBinding Label}" TextAlignment="Right" /> <TextBox x:Name="Content" Grid.Column="1" Width="Auto" Height="22" Margin="4,0,30,0" VerticalAlignment="Center" Style="{StaticResource ExpandableTextBox_Style}" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
使用过程 <controls:LabeledTextBoxControl Grid.Row="0" Grid.Column="0" KeyboardNavigation.TabIndex="0" Label="Project :" MaxLength="30" Style="{StaticResource LabeledTextBoxControl_Style}" Text="{Binding Path=ProjectName, UpdateSourceTrigger=PropertyChanged}" />
下面是一个用作LabeledCommentControl的例子,其实还是使用的LabeledTextBoxControl,区别是个头大点,可以wrap里面的text
<Style x:Key="LabeledCommentControl_Style" TargetType="{x:Type controls:LabeledTextBoxControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type controls:LabeledTextBoxControl}"> <Grid VerticalAlignment="Stretch"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock x:Name="Label" Grid.Column="0" Margin="0" VerticalAlignment="Top" FontSize="9pt" FontWeight="Normal" Foreground="#FF221F1F" Style="{StaticResource Univers57_Condensed}" Text="{TemplateBinding Label}" TextAlignment="Right" /> <TextBox x:Name="Content" Grid.Column="1" Width="Auto" Height="Auto" Margin="4,0,30,0" AcceptsReturn="True" Style="{StaticResource ExpandableTextBox_Style}" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="Wrap" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
LabeledDatePickerControl:
<controls:LabeledDatePickerControl Grid.Row="2" Grid.Column="1" KeyboardNavigation.TabIndex="7" Label="Date :" Style="{StaticResource LabeledDatePicker_Style}" />
<Style x:Key="LabeledDatePicker_Style" TargetType="{x:Type controls:LabeledDatePickerControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type controls:LabeledDatePickerControl}"> <Grid MaxHeight="30" VerticalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock x:Name="Label" Grid.Column="0" VerticalAlignment="Center" FontSize="9pt" FontWeight="Normal" Foreground="#FF221F1F" Style="{StaticResource Univers57_Condensed}" Text="{TemplateBinding Label}" TextAlignment="Right" /> <DatePicker Grid.Column="1" Margin="4,0,30,0" VerticalAlignment="Center" SelectedDateFormat="Long" Style="{StaticResource Base_DatePicker_Style}" Text="{Binding Path=ProjectDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; namespace Halliburton.Castor.Controls { class LabeledDatePickerControl : ContentControl { public static readonly DependencyProperty LabelProperty; static LabeledDatePickerControl() { LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(LabeledDatePickerControl), new FrameworkPropertyMetadata(string.Empty)); } public string Label { get { return (string)GetValue(LabelProperty); } set { SetValue(LabelProperty, value); } } } }
LabeldControl:
可以装任何controls在label的后面,包括joey的valueEditor,valuedComboBox等
下面是FluidViscosity的例子:
这里例子里的FluidViscosity是用我自己写的LabeledControl 做的,而CasedHoleID是直接用Joey的LabeledMeasurementEditor做的,他里面也有Field的属性和我的label的意思一样。注意可以把任何一个ControlTemplate类型放在一个ContentControl的Template属性下。
这个是CasedHoleID的例子
<ControlTemplate x:Key="HoleID_Template"> <controls:LabeledMeasurementEditor x:Name="HoleID" MinWidth="120" DisplayPrecision="3" Field="HoleID" StorageMaximumValue="50" StorageMinimumValue="0.001" StorageValue="{Binding HoleID, UpdateSourceTrigger=PropertyChanged}" /> <ControlTemplate.Triggers> <DataTrigger Binding="{Binding IsOpenHole}" Value="True"> <Setter TargetName="HoleID" Property="Label" Value="Open Hole ID : " /> </DataTrigger> <DataTrigger Binding="{Binding IsOpenHole}" Value="False"> <Setter TargetName="HoleID" Property="Label" Value="Cased Hole ID : " /> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate>
<ContentControl Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" MinWidth="120" Focusable="False" Template="{StaticResource HoleID_Template}" />
下面的是FluidViscosity的部分
<controls:LabeledControl Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" MinWidth="120" Margin="20,0,-30,0" VerticalAlignment="Bottom" Label="Fluid Viscosity " Style="{StaticResource HorizontalLabeledControl_Style}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="25" /> </Grid.ColumnDefinitions> <UnitLibrary_Controls:ValueEditor VerticalAlignment="Bottom" DisplayPrecision="3" StorageMaximumValue="10000" StorageMinimumValue="0.001" StorageValue="{Binding FluidViscosity, TargetNullValue=0, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ValueEditor_Style}" /> <TextBlock Grid.Column="1" Margin="2,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="9pt" Foreground="#FF221F1F" Style="{StaticResource Univers57_Condensed}" Text="cp" /> </Grid> </controls:LabeledControl>
<Style x:Key="HorizontalLabeledControl_Style" TargetType="{x:Type controls:LabeledControl}"> <Setter Property="Template" Value="{StaticResource HorizontalLabeledControl_Template}" /> <Setter Property="LabelStyle" Value="{StaticResource Univers57_Condensed}" /> </Style>
<ControlTemplate x:Key="HorizontalLabeledControl_Template" TargetType="{x:Type controls:LabeledControl}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="9pt" FontWeight="Normal" Foreground="#FF221F1F" Style="{TemplateBinding LabelStyle}" Text="{Binding Label, RelativeSource={RelativeSource TemplatedParent}, StringFormat=\{0\}:}" TextAlignment="Right" /> <ContentPresenter Grid.Column="1" Margin="4,0,30,0" VerticalAlignment="Center" /> </Grid> </ControlTemplate>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; namespace Halliburton.Castor.Controls { class LabeledControl:ContentControl { public static readonly DependencyProperty LabelProperty; public static readonly DependencyProperty LabelStyleProperty; static LabeledControl() { Type ownerType = typeof(LabeledControl); LabelProperty = DependencyProperty.Register("Label", typeof(string), ownerType); LabelStyleProperty = DependencyProperty.Register("LabelStyle", typeof(Style), ownerType); FocusableProperty.OverrideMetadata(ownerType, new FrameworkPropertyMetadata(false)); } public string Label { get { return (string)GetValue(LabelProperty); } set { SetValue(LabelProperty, value); } } public Style LabelStyle { get { return (Style)GetValue(LabelStyleProperty); } set { SetValue(LabelStyleProperty, value); } } } }
另外一个带两个RaidoButton的例子:
<controls:LabeledControl Grid.Row="3" Grid.Column="6" Grid.ColumnSpan="3" Margin="40,0,-30,0" Label="End Rings " Style="{StaticResource HorizontalLabeledControl_Style}" Visibility="{Binding ElementName=BondedToPipe, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}"> <StackPanel HorizontalAlignment="Left" VerticalAlignment="Center" Orientation="Horizontal" Visibility="{Binding ElementName=BondedToPipe, Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}"> <RadioButton Margin="3,0,0,0" Content="Standard" IsChecked="{Binding ToolInfo.IsStandard}" Style="{StaticResource RadioButton_Style}" /> <RadioButton Margin="10,0,0,0" Content="K2 End-Ring" IsChecked="{Binding ToolInfo.IsK2}" Style="{StaticResource RadioButton_Style}" /> </StackPanel> </controls:LabeledControl>