更改DatePicker的边框颜色

时间:2010-12-07 21:55:58

标签: c# silverlight xaml

我想在DatePicker控件上更改焦点状态的边框颜色。 我查看了默认样式模板,但没有看到VisualStateManager的任何焦点状态。

我唯一看到的是TextBox的原始控件,如下所示:

<controlsPrimitives:DatePickerTextBox x:Name="TextBox" SelectionBackground="{TemplateBinding SelectionBackground}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Grid.Column="0" />

如何更改DatePicker边框的焦点状态颜色...我可以更改TextBoxComboBox和{{ 1}}控件。

请帮助!

2 个答案:

答案 0 :(得分:4)

你是对的,DatePicker控件没有VisualStateManager的焦点状态。请注意, 可以为DatePicker添加状态组和聚焦/未聚焦状态,但这不是最佳方法。

DatePicker控件的template包含DatePickerTextBox control,根据MSDN,“代表DatePicker的文本输入”。

查看DatePickerTextBox的模板,我们发现它有一个FocusStates州状态组,以及UnfocusedFocused状态的定义。我们也找到了这一行:

<Border x:Name="FocusVisual" BorderBrush="#FF6DBDD1" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" IsHitTestVisible="False" Opacity="0"/>

正如您所看到的,默认的“聚焦颜色”是#FF6DBDD1Focused的{​​{1}}州将此边框的DatePickerTextBox属性设置为Opacity

要更改1状态的边框颜色,您可以创建此模板的副本,将Focused替换为您想要的颜色。然后,创建#FF6DBDD1模板的副本,该副本应指定其中包含的DatePicker应使用您修改过的模板。

或者,您可以创建DatePickerTextBox模板的副本,调整边框颜色,并将此模板放置在DatePickerTextBox设置为TargetType的样式中:

DatePickerTextBox

希望这对你有用!


编辑:<Style x:Key="MyStyle1" TargetType="DatePickerTextBox"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="DatePickerTextBox"> <!-- Modified template for DatePickerTextBox goes here --> </ControlTemplate> </Setter.Value> </Setter> </Style> 的默认模板
控件的大多数默认样式和模板都可用on MSDN。但是(无论出于何种原因),DatePickerTextBox不是。如果您有Expression Blend的副本(我强烈建议您使用控件的外观;它非常宝贵 - 下载免费试用版here),您可以执行以下操作:

右键点击DatePickerTextBox,点击“修改模板 - &gt;编辑副本...”。您将在“对象和时间轴”面板中看到DatePicker。右键单击它,再次单击“编辑模板 - &gt;编辑副本...”。然后,您可以在“对象和时间线”面板中右键单击模板,然后单击“查看XAML”。

同样,如果你正在做这样的任何工作,我不能高度推荐Blend。从长远来看,它将为您节省大量时间(您将学习很多关于XAML,样式,模板,它们如何组合在一起等等)。但是,如果您无法访问它,则这是DatePickerTextBox控件的默认模板:

DatePickerTextBox

长篇道歉,非常感谢this thread(有同样的问题)。

答案 1 :(得分:0)

这适合你吗?

public class MyDatePicker : DatePicker
{
    public MyDatePicker()
    { }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        DatePickerTextBox textBox = (DatePickerTextBox)this.GetTemplateChild("TextBox");
        textBox.GotFocus += new RoutedEventHandler(textBox_GotFocus);
        textBox.LostFocus += new RoutedEventHandler(textBox_LostFocus);
    }

    void textBox_GotFocus(object sender, RoutedEventArgs e)
    {
        (sender as DatePickerTextBox).BorderBrush = new SolidColorBrush(Colors.Red);
    }

    void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        (sender as DatePickerTextBox).ClearValue(DatePickerTextBox.BorderBrushProperty);
    }
}