0

わかりましたので、ここに問題があります。これを機能させる方法を見つけようとしています:

カスタム ボタンを作成するには、次の ControlTemplate を検討してください。

<ControlTemplate x:Key ="cButton" TargetType="{x:Type Button}">
      <!--Styles-->
      <Grid x:Name="bkg">
      <Grid.Background>
         <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
           <GradientStop Color="{TemplateBinding Background}" Offset="0.5"/><!-- Error! -->
           <GradientStop Color="White" Offset="1.0"/>
       </LinearGradientBrush>
      </Grid.Background>
      <ContentPresenter 
    TextBlock.FontSize="80" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    ContentSource="Content" />
      </Grid>
      <!--Triggers-->
      <ControlTemplate.Triggers>
         <Trigger Property="IsPressed" Value="True">
         <Setter TargetName="bkg" Property="Background" Value="White"/>
         </Trigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>

このコントロール テンプレートはこのスクリプトの一部を形成し、ご覧のとおり、メイン グリッドで概説されているボタン宣言から背景色を取得しようとしています。

<Grid>
<Grid.Resources>
   <ControlTemplate x:Key ="cButton" TargetType="{x:Type Button}">
      <!--Styles-->
      <Grid x:Name="bkg">
      <Grid.Background>
         <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
           <GradientStop Color="{TemplateBinding Background}" Offset="0.5"/><!-- Error! -->
           <GradientStop Color="White" Offset="1.0"/>
       </LinearGradientBrush>
      </Grid.Background>
      <ContentPresenter 
    TextBlock.FontSize="80" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    ContentSource="Content" />
      </Grid>
      <!--Triggers-->
      <ControlTemplate.Triggers>
         <Trigger Property="IsPressed" Value="True">
         <Setter TargetName="bkg" Property="Background" Value="White"/>
         </Trigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>
  </Grid.Resources>
  <Grid.ColumnDefinitions>
   <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions >
  <Button Name="btnIn" Grid.Column="0" Content="IN" Background="Green"  Foreground="White" Template="{StaticResource cButton}"/>
  <Button Name="btnOut" Grid.Column="1" Content="OUT" Background="Red" Foreground="White" Template="{StaticResource cButton}" />
  </Grid>

さて、主な質問はこれです..

質問 1: templatebinding を使用して背景色を取得しないボタンの ControlTemplate でエラー コメントがマークされている行が表示されるのはなぜですか? 無地を使用していれば問題なく機能していたので、この方法で機能しない理由はわかりません. また、その理由を教えてください。

以下はまだ少し不明確であり、それらが問題に関連しているかどうかはわかりません。誰かがそれらをクリアできれば、それは素晴らしいことです.

質問 2: これら 2 つの TargetType 値 "Button" と "{x:Type Button}" の違いは何ですか。それらが同等のタイプであることは知っていますが、2つに違いはありますか? MSDN を読みましたが、実際の違いはそれほど明確ではありません。

質問 3: いつ x:Name を使用し、いつ Name を使用しますか? 違いはまた不明です。

質問 4: x:Static は何をしますか?

4

1 に答える 1

0

Background プロパティが Brush (クラス) であるため、テンプレートが正しく機能しないと思います。そして、それを Color (構造体) にバインドしてみます

UPD 次のような単純なコンバーターを使用できます。

public class BrushToColorConverter: IValueConverter{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush b = value as SolidColorBrush;
        if (b != null)
        {
            return b.Color;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

リソースに追加します。

<wpfApplication1:BrushToColorConverter x:Key="btcConv"/>

スタイルを変更します。

 <Grid.Background>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="{Binding Path=Background, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource btcConv}}" Offset="0.5"/>
                        <GradientStop Color="White" Offset="1.0"/>
                    </LinearGradientBrush>
                </Grid.Background>

または、次のようなバインドを使用できます (Background が SolidColorBrush であることが確実な場合):

<GradientStop Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}}" Offset="0.5"/>
于 2013-01-18T07:36:51.610 に答える