1

「ブラシ」と呼ばれるカスタム依存関係コントロールから取得した色で楕円を表示する非常に単純なボタンベースのコントロールがあります。

テンプレートは適切な色で楕円を表示しますが、トリガーのセッターは「ブラシ」プロパティを認識しません (以下の XAML ファイルで強調表示されているエラー)。

マウスオーバーで値を変更できるように、セッターの「ブラシ」プロパティにアクセスする方法は?

XAML:

<Button x:Class="WpfTest.EllipseButton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest"
        Style="{DynamicResource localStyle}"
        Name="ellipseButton">

  <Button.Resources>
    <Style x:Key="localStyle"
           TargetType="local:EllipseButton">
      <Style.Setters>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate>
              <Grid>
                <Ellipse Fill="{Binding ElementName=ellipseButton, Path=Brush}" />
              </Grid>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style.Setters>
      <Style.Triggers>
        <Trigger Property="IsMouseOver"
                 Value="True">

          <!-- ERROR HERE: The property "Brush" is not a dependency property. -->
          <Setter Property="Brush"
                  Value="Blue" />
          <!-- ERROR HERE: The "BrushProperty" is not recognized or is not accessible.  -->
          <Setter Property="BrushPropety"
                  Value="Blue" />

        </Trigger>
      </Style.Triggers>
    </Style>
  </Button.Resources>
  <Grid>
  </Grid>
</Button>

コード ビハインド:

public partial class EllipseButton : Button
{
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(
        "Fill",
        typeof(Brush),
        typeof(EllipseButton),
        new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Gray)));

    public Brush Brush
    {
        get
        {
            return (Brush)GetValue(BrushProperty);
        }
        set
        {
            SetValue(BrushProperty, value);
        }
    }

    public EllipseButton()
    {
        InitializeComponent();
    }
}
4

2 に答える 2

1

さて、いくつかのことを行う必要がありました:

1) 依存関係プロパティの名前を「ブラシ」に変更します (誤って「塗りつぶし」と名付けられました) - HighCore のおかげです

2) コントロールがコードで使用されている場合は、「ブラシ」プロパティの設定を削除します。ローカル値がスタイルからセッターをオーバーライドします。

3) スタイルをカスタム コントロールから上位レベルに移動します (たとえば、"Themes\Generic.xaml" の下)。

4) スタイルから x:Key 属性を削除し、型名のみを保持します (理由はまだわかりません...)

5)「ブラシ」プロパティのデフォルト値をスタイルセッターに追加します(繰り返しますが、理由はわかりません...)

EllipseButton.xaml を修正しました:

<Button x:Class="WpfTest.EllipseButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid/>
</Button>

固定コード ビハインド:

public partial class EllipseButton
{
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(
        "Brush",
        typeof(Brush),
        typeof(EllipseButton),
        new FrameworkPropertyMetadata(null));

    public Brush Brush
    {
        get
        {
            return (Brush)GetValue(BrushProperty);
        }
        set
        {
            SetValue(BrushProperty, value);
        }
    }

    public EllipseButton()
    {
        InitializeComponent();
    }
}

固定スタイル (Generic.xaml):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfTest">

    <Style TargetType="local:EllipseButton">
        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid>
                            <Ellipse Fill="{Binding ElementName=ellipseButton, Path=Brush}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Brush" Value="Pink"/>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Brush" Value="Red"/>
            </Trigger>
        </Style.Triggers>
    </Style>

</ResourceDictionary>
于 2013-04-20T23:27:07.240 に答える
1

プロパティは「ブラシ」ではなく「塗りつぶし」と呼ばれます。

public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(
        "Fill", //Error is here
        typeof(Brush),
        typeof(EllipseButton),
        new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Gray)));

それを次のように変更します。

public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(
        "Brush", 
        typeof(Brush),
        typeof(EllipseButton),
        new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Gray)));
于 2013-04-20T16:15:20.600 に答える