0

基本的に、コントロール テンプレートを作成したボタンがあります。現在動作していますが、VS 2010 は、コントロール テンプレートの次のコード行について不平を言っています

<TextBlock Text="{TemplateBinding Content}" 
    Foreground="{TemplateBinding Foreground}" 
    x:Name="cContentTextBlock"  />

コントロール テンプレートはボタン用で、この TextBlock を対象とするさまざまな VisualStates があります。

VS2010 が不平を言う理由がわかります...コンテンツが実際にテキストでない場合はどうなりますか? これは問題を引き起こします。私にとって重要なのは、視覚状態の変化に応じてテキストの前景を設定したいということです。

これをどのように達成できるかについてのアイデアはありますか? (試してみてください、うまくいきます...しかし、vs2010デザイナーはそれを窒息させます)

以下はスタイル全体です。

<Style x:Key="PassiveLinkButton" TargetType="Button">
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <vsm:VisualStateManager.VisualStateGroups>
                        <vsm:VisualStateGroup x:Name="CommonStates">
                            <vsm:VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="cMouseOverBorder" Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="Black" />
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Normal"/>
                            <vsm:VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="cMouseOverBorder" Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="Blue" />
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="cContentTextBlock" Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="Blue" />
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Disabled"/>
                        </vsm:VisualStateGroup>
                    </vsm:VisualStateManager.VisualStateGroups>
                    <Border x:Name="cFocusBorder" 
                                BorderThickness="1" 
                                BorderBrush="{StaticResource BorderBrush}"
                                Margin="2">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Border x:Name="cMouseOverBorder" 
                                BorderBrush="Transparent" BorderThickness="0,0,0,1" Margin="0 0 0 2">
                                <StackPanel HorizontalAlignment="Left">
                                    <TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" 
                                                x:Name="cContentTextBlock" Margin="2 2 2 0"
                                                HorizontalAlignment="Center" />
                                </StackPanel>
                            </Border>
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>

    </Setter>
</Style>

次のように使用されます。

<Button Content="Press Me" Style={StaticResource PassiveButtonLink}" />
4

2 に答える 2

0

まだお読みでない場合は、この MSDN ドキュメントをお読みください。

チュートリアル: ControlTemplate を使用してボタンの外観をカスタマイズする http://msdn.microsoft.com/en-us/library/cc903963(VS.95).aspx

それよりも深くする必要がある場合は、次のようにします。

ControlTemplate を使用して既存のコントロールの外観をカスタマイズする http://msdn.microsoft.com/en-us/library/cc189093(VS.95).aspx

ControlTemplate を作成して新しいコントロールを作成する
http://msdn.microsoft.com/en-us/library/cc278064(VS.95).aspx

于 2009-11-03T22:18:40.093 に答える
0

同様の問題がありました。私にとっての解決策は、デフォルトの XML 名前空間を変更することでした。

以下はVS2008の私のコピーでは機能しますが、VS2010では機能しません:

xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"

以下は、 VS2008 と VS2010の両方で機能します。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

「機能する」とは、WPF デザイナーが TemplateBinding 要素を認識することを意味します。

于 2010-04-15T17:15:37.557 に答える