2

私はWPFとXAMLを学んでいます。しかし、私は初心者で、質問があります。

私の目的 - カレンダーで選択した日のテキストを変更します。これで背景が青色になりました。しかし、2つの括弧が必要です: (...):

画像

この問題には 2 つの解決策があります。

初め。コントロール テンプレートを変更します。MSDN サイトで完全なテンプレート コードを見つけました。しかし、コードが多すぎて、背景色をブラケットに置き換える方法が見つかりません。「テキスト」プロパティが見つからないためです。見つかったら、水平の StackPanel に置き換えて、日付の前後に "(" と ")" を含む 2 つの TextBox を追加します。しかし、私はできません。できれば、このコードをすべてコピーする必要がありますか?

2番。私が知っているように、カレンダーのすべての日は CalendarDayButton タイプです。このタイプには「コンテキスト」プロパティがあります。たぶん、私がそれを変更すると、テキストが変更されます。知らない。しかし、私はこのタイプに直接アクセスしていません。カレンダーのすべての子アイテムを取得し、それらの中から選択した日を検索する必要があります。複雑すぎると思います。

この問題のよりエレガントな解決策を知っていれば、とても感謝しています。

4

1 に答える 1

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

とにかく、これはあなたにかなりまともな方向性を与えるはずです、それが役立つことを願っています.

于 2013-02-21T23:11:59.940 に答える