在我的WPF應用程序中,我已經重新設計了ComboBox。問題是我似乎無法正確應用BorderThickness。我認爲我做得正確,但我必須錯過一些東西,因爲結果不是我所期望的(它始終保持爲1的厚度)。TemplateBinding沒有傳遞正確的值
組合框如在用戶控件使用(注意3的厚度):
<ComboBox DockPanel.Dock="Top" SelectedItem="{Binding CurrentAnalysisKey}"
ItemsSource="{Binding AnalysisKeys}" Height="25"
BorderBrush="{StaticResource ListBoxBorderBrush}"
BorderThickness="3"
DisplayMemberPath="ReaffectedName" Margin="0,5" />
如在資源文件中定義的組合框風格:
<Style TargetType="{x:Type ComboBox}">
<Setter Property="Foreground"
Value="White" />
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="BorderBrush"
Value="{StaticResource BlackBorderBrush}" />
<Setter Property="BorderThickness"
Value="2" />
<Setter Property="Template"
Value="{DynamicResource ComboBoxTemplate}" />
</Style>
<Style d:IsControlPart="True"
TargetType="{x:Type ComboBoxItem}">
<Setter Property="Foreground"
Value="White" />
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<ControlTemplate.Resources>
<Storyboard x:Key="HoverOn">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="HoverRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="HoverOff">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="HoverRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="SelectedOn">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="SelectedRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="SelectedOff">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="SelectedRectangle"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Grid SnapsToDevicePixels="true"
Margin="1"
IsHitTestVisible="True">
<Rectangle x:Name="Background"
IsHitTestVisible="True"
Opacity="0.25"
Fill="{StaticResource NormalBrush}"
RadiusX="1"
RadiusY="1" />
<Rectangle x:Name="HoverRectangle"
IsHitTestVisible="True"
Opacity="0"
Fill="{StaticResource NormalBrush}"
RadiusX="1"
RadiusY="1" />
<Rectangle x:Name="SelectedRectangle"
IsHitTestVisible="False"
Opacity="0"
Fill="{StaticResource SelectedBackgroundBrush}"
RadiusX="1"
RadiusY="1" />
<ContentPresenter Margin="5,2,0,2"
x:Name="contentPresenter"
VerticalAlignment="Center" />
<Rectangle x:Name="FocusVisualElement"
Visibility="Collapsed"
Stroke="{StaticResource HoverShineBrush}"
StrokeThickness="1"
RadiusX="1"
RadiusY="1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted"
Value="true">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource SelectedOff}"
x:Name="SelectedOff_BeginStoryboard" />
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource SelectedOn}"
x:Name="SelectedOn_BeginStoryboard" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource HoverOff}"
x:Name="HoverOff_BeginStoryboard" />
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource HoverOn}" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource DisabledForegroundBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="{x:Static ToolBar.ComboBoxStyleKey}"
TargetType="{x:Type ComboBox}">
<Setter Property="FontSize"
Value="10" />
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="Template"
Value="{DynamicResource ComboBoxTemplate}" />
<Setter Property="Foreground"
Value="White" />
</Style>
組合框模板:(所述ThicknessConverter用於吐出接收到調試窗口的厚度)
<ControlTemplate x:Key="ComboBoxTemplate"
TargetType="{x:Type ComboBox}">
<Grid x:Name="grid">
<Grid.Resources>
<converters:ComboBoxThicknessConverter x:Key="thicknessConv" />
</Grid.Resources>
<ToggleButton Template="{DynamicResource ComboBoxToggleButton}"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
x:Name="ToggleButton"
Focusable="false"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press" />
<ContentPresenter HorizontalAlignment="Left"
x:Name="ContentSite"
Margin="{TemplateBinding BorderThickness, Converter={StaticResource thicknessConv}}"
VerticalAlignment="Center"
Content="{TemplateBinding SelectedItem}"
ContentTemplate="{TemplateBinding ItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
IsHitTestVisible="False" />
<Popup IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"
x:Name="Popup"
Focusable="False"
AllowsTransparency="True"
PopupAnimation="Slide">
<Grid MaxHeight="{TemplateBinding MaxDropDownHeight}"
MinWidth="{TemplateBinding ActualWidth}"
x:Name="DropDown"
SnapsToDevicePixels="True">
<Border x:Name="DropDownBorder"
Background="{DynamicResource ControlBackgroundBrush}"
CornerRadius="3" />
<ScrollViewer Margin="4,6"
Style="{DynamicResource NuclearScrollViewer}"
SnapsToDevicePixels="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
CanContentScroll="True"
Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}">
<StackPanel IsItemsHost="True"
KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasItems"
Value="false">
<Setter Property="MinHeight"
Value="95"
TargetName="DropDownBorder" />
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource DisabledForegroundBrush}" />
<Setter Property="Opacity"
TargetName="grid"
Value="0.5" />
</Trigger>
<Trigger Property="IsGrouping"
Value="true">
<Setter Property="ScrollViewer.CanContentScroll"
Value="false" />
</Trigger>
<Trigger Property="AllowsTransparency"
SourceName="Popup"
Value="true">
<Setter Property="Margin"
Value="0,2,0,0"
TargetName="DropDownBorder" />
</Trigger>
<Trigger Property="local:Dragging.IsDragTarget"
Value="True">
<Setter Property="BorderBrush"
Value="{StaticResource DragTargetBorderBrush}"
TargetName="ToggleButton" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
聯合mboBoxToggleButton:
<ControlTemplate x:Key="ComboBoxToggleButton"
TargetType="{x:Type ToggleButton}">
<Grid x:Name="grid">
<Grid.Resources>
<converters:SpecialThicknessConverter x:Key="cv2" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Rectangle Grid.ColumnSpan="2"
HorizontalAlignment="Stretch"
x:Name="Rectangle"
VerticalAlignment="Stretch"
RadiusX="3"
RadiusY="3"
StrokeThickness="{TemplateBinding BorderThickness, Converter={StaticResource cv2}}"
Fill="{DynamicResource LightBrush}"
Stroke="{TemplateBinding BorderBrush}" />
<Border Grid.Column="1"
Margin="2"
Background="{DynamicResource BorderBrush}"
CornerRadius="3"
x:Name="border" />
<Border Grid.Column="1"
Margin="2"
Background="{DynamicResource HoverBrush}"
CornerRadius="3"
x:Name="HoverBorder"
Opacity="0" />
<Border Grid.Column="1"
Margin="2"
Background="{DynamicResource HoverShineBrush}"
CornerRadius="3"
x:Name="HoverShineBorder"
Opacity="0" />
<Path Grid.Column="1"
HorizontalAlignment="Center"
x:Name="Arrow"
VerticalAlignment="Center"
Fill="{x:Null}"
Data="M0.5,0.5 L3,6.5 5.5,0.5"
Stroke="{DynamicResource GlyphBrush}"
Margin="5,0"
Height="7"
StrokeThickness="2"
Stretch="Fill" />
<Border Grid.Column="1"
Margin="2"
Background="{DynamicResource ShineBrush}"
CornerRadius="3"
x:Name="ShineBorder" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="true">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource HoverOff}"
x:Name="HoverOff_BeginStoryboard" />
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource HoverOn}" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsChecked"
Value="true" />
<Trigger Property="IsEnabled"
Value="False">
<Setter Property="Foreground"
Value="{DynamicResource DisabledForegroundBrush}" />
<Setter Property="Stroke"
TargetName="Arrow"
Value="{DynamicResource DisabledForegroundBrush}" />
<Setter Property="Background"
TargetName="border"
Value="{DynamicResource DisabledBorderBrush}" />
<Setter Property="Opacity"
TargetName="grid"
Value="0.8" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
一厚度轉換器被用來留下空間邊框和路徑構成的組合框(20個像素)的右側的按鈕。兩者都包括如下:1.
任何想法,我要去哪裏:
public class ComboBoxThicknessConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var oldT = (Thickness)value;
//Debug.WriteLine("cbx templ thickness = {" + oldT.Left + ", " + oldT.Top + ", " + oldT.Right + ", " + oldT.Bottom + "}");
return new Thickness(oldT.Left, oldT.Top, oldT.Right + 20, oldT.Bottom);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
public class SpecialThicknessConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var oldT = (Thickness)value;
Debug.WriteLine("toggle btn thickness = {" + oldT.Left + ", " + oldT.Top + ", " + oldT.Right + ", " + oldT.Bottom + "}");
return oldT;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
除非我手動更改StrokeThickness的ComboBoxToggleButton內的硬編碼值,我總是以相同的厚度結束錯誤?據我所知,我正確地將ComboBox中的BorderThickness沿着每個層次傳遞到ComboBoxToggleButton中的Rectangle。但是,當我查看調試窗口時,我在ComboBox Style中看到setter中使用的值,而不是在聲明ComboBox時使用的值。
在此先感謝!
肖恩
使用與TemplatedParent的綁定是解決方案的一部分。另一部分是我的答案中描述的類型不匹配。謝謝您的幫助。 –