在日历中更改选定的日期背景(或文本)

时间:2013-02-21 21:00:29

标签: c# .net wpf xaml user-interface

我正在学习WPF和XAML。但我是新手,有一个问题。

我的目的 - 在日历中更改所选日期的文字。现在,它有蓝色背景。但我想要两个括号:(...):

image

我看到了这个问题的两个解决方案。

首先。更改控制模板。我找到了full template code on MSDN site。但是有太多的代码,我找不到任何方法将背景颜色替换为括号,因为我找不到“文本”属性。如果我找到它,我只需用水平StackPanel替换它,并在日期之前和之后添加两个带有“(”和“)”的TextBox。但我不能。如果可以,我真的应该复制所有这些代码吗?

二。据我所知,日历中的所有日子都是CalendarDayButton类型。此类型具有“上下文”属性。也许,如果我改变它,那么文本就会改变。我不知道。但我没有直接访问这种类型。我应该让所有孩子的日历项目和搜索选定的日期。我认为这太复杂了。

如果您对此问题有更优雅的解决方案 - 我将非常感谢您。

1 个答案:

答案 0 :(得分:1)

是的,所以你用第一次观察回答了你的问题。因此,如果我们在给出的MSDN示例中查看该代码并关注您的CalendarButton Style模板,您可以从上到下分解其工作方式。请参阅下面复制的示例中的注释。

         <!-- **********
            Ok, so we know this is the bugger we want to deal with.
            -->
            <Style TargetType="CalendarButton"
                   x:Key="CalendarButtonStyle">
              <Setter Property="MinWidth"
                      Value="40" />
              <Setter Property="MinHeight"
                      Value="42" />
              <Setter Property="FontSize"
                      Value="10" />
              <Setter Property="HorizontalContentAlignment"
                      Value="Center" />
              <Setter Property="VerticalContentAlignment"
                      Value="Center" />
              <Setter Property="Template">
                <Setter.Value>
                  <ControlTemplate TargetType="CalendarButton">
                    <Grid>
            <!-- *************
            What we want to change is the stuff that happens
        for a State, in this case the Selected State. So we just
        go look at what exactly it is doing for that Selected State.
            -->
                      <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup Name="CommonStates">
                          <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0:0:0.1" />
                          </VisualStateGroup.Transitions>
                          <VisualState Name="Normal" />
                          <VisualState Name="MouseOver">
                            <Storyboard>
                              <DoubleAnimation Storyboard.TargetName="Background"
                                               Storyboard.TargetProperty="Opacity"
                                               To=".5"
                                               Duration="0" />
                            </Storyboard>
                          </VisualState>
                          <VisualState Name="Pressed">
                            <Storyboard>
                              <DoubleAnimation Storyboard.TargetName="Background"
                                               Storyboard.TargetProperty="Opacity"
                                               To=".5"
                                               Duration="0" />
                            </Storyboard>
                          </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup Name="SelectionStates">
                          <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0" />
                          </VisualStateGroup.Transitions>
                          <VisualState Name="Unselected" />
            <!-- ************
        Hey, look at that. So this guy's telling something called "SelectedBackground" 
        with some opacity to show up and be seen. Now we know we need to go check out 
        this SelectedBackground object he's talking to.
            -->
                          <VisualState Name="Selected">
                            <Storyboard>
                              <DoubleAnimation Storyboard.TargetName="SelectedBackground"
                                               Storyboard.TargetProperty="Opacity"
                                               To=".75"
                                               Duration="0" />
                            </Storyboard>
                          </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup Name="ActiveStates">
                          <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0" />
                          </VisualStateGroup.Transitions>
                          <VisualState Name="Active" />
                          <VisualState Name="Inactive">
                            <Storyboard>
                              <ColorAnimation Duration="0"
                                              Storyboard.TargetName="NormalText"
                                              Storyboard.TargetProperty="(TextElement.Foreground).
                                  (SolidColorBrush.Color)"
                                              To="#FF777777" />
                            </Storyboard>
                          </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup Name="CalendarButtonFocusStates">
                          <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0" />
                          </VisualStateGroup.Transitions>
                          <VisualState Name="CalendarButtonFocused">
                            <Storyboard>
                              <ObjectAnimationUsingKeyFrames Duration="0"
                                                             Storyboard.TargetName="CalendarButtonFocusVisual"
                                                             Storyboard.TargetProperty="Visibility">
                                <DiscreteObjectKeyFrame KeyTime="0">
                                  <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Visible</Visibility>
                                  </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                          </VisualState>
                          <VisualState Name="CalendarButtonUnfocused" />
                        </VisualStateGroup>
                      </VisualStateManager.VisualStateGroups>
            <!-- ***************
            Sneaky bugger... looks like there is something called SelectedBackground
 (Rectangle) sitting here with a 0 opacity 
waiting to be told to show himself. 
    Imagine that.
            -->
                      <Rectangle x:Name="SelectedBackground"
                                 RadiusX="1"
                                 RadiusY="1"
                                 Opacity="0">
                        <Rectangle.Fill>
                          <SolidColorBrush Color="{DynamicResource SelectedBackgroundColor}" />
                        </Rectangle.Fill>
                      </Rectangle>
                      <Rectangle x:Name="Background"
                                 RadiusX="1"
                                 RadiusY="1"
                                 Opacity="0">
                        <Rectangle.Fill>
                          <SolidColorBrush Color="{DynamicResource SelectedBackgroundColor}" />
                        </Rectangle.Fill>
                      </Rectangle>
                      <ContentPresenter x:Name="NormalText"
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        Margin="1,0,1,1">
                        <TextElement.Foreground>
                          <SolidColorBrush Color="#FF333333" />
                        </TextElement.Foreground>
                      </ContentPresenter>
                      <Rectangle x:Name="CalendarButtonFocusVisual"
                                 Visibility="Collapsed"
                                 IsHitTestVisible="false"
                                 RadiusX="1"
                                 RadiusY="1">
                        <Rectangle.Stroke>
                          <SolidColorBrush Color="{DynamicResource SelectedBackgroundColor}" />
                        </Rectangle.Stroke>
                      </Rectangle>
                    </Grid>
                  </ControlTemplate>
                </Setter.Value>
              </Setter>
              <Setter Property="Background">
                <Setter.Value>
                  <SolidColorBrush Color="{DynamicResource ControlMediumColor}" />
                </Setter.Value>
              </Setter>
            </Style>

所以你找到了最初的罪魁祸首。您可以删除Rectangle或只删除Transparent或其他内容。然后返回指出的SelectedState中的VisualStateManager声明。 编辑: 我们将采用不同的方法,而是展示另一个元素。

<VisualState Name="Selected">
   <Storyboard>
      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedText"
                                     Storyboard.TargetProperty="Visibility">
             <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
      </ObjectAnimationUsingKeyFrames>
      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalText"
                                     Storyboard.TargetProperty="Visibility">
             <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"/>
      </ObjectAnimationUsingKeyFrames>
   </Storyboard>
</VisualState>

编辑:

<!--
<ContentPresenter x:Name="NormalText"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                  Margin="1,0,1,1">
                    <TextElement.Foreground>
                      <SolidColorBrush Color="#FF333333" />
                    </TextElement.Foreground>
                  </ContentPresenter>
-->
<TextBlock x:Name="NormalText"
           Text="{TemplateBinding Content}"
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
           Margin="1,0,1,1"/>
<TextBlock x:Name="SelectedText" Visibility="Collapsed"
           Text="{TemplateBinding Content, StringFormat='(\{\0})'}"
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
           Margin="1,0,1,1"/>

现在,当按钮位于SelectedState时,它应该显示TextBlock并在其周围加上'()`并隐藏那个没有它的那个。

无论如何这应该给你一个相当不错的方向,希望它有所帮助。