2

ドラッグ アンド ドロップ ターゲットとして機能するカスタム コントロールを作成するときに、AllowDropプロパティをに設定する必要がありましたtrueDrop最初に次のコードを使用しましたが、イベントがトリガーされないことがわかりました。

EditorVisual.cs

public class EditorVisual : Control
{
    static EditorVisual()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(EditorVisual),
            new FrameworkPropertyMetadata(typeof(EditorVisual)));
        AllowDropProperty.OverrideMetadata(typeof(EditorVisual),
            new FrameworkPropertyMetadata(true));
    }
    // ...
    protected override void OnDrop(DragEventArgs e)
    {
        base.OnDrop(e);
        // this is never called
    }
}

テーマ/Generic.xaml

<Style TargetType="{x:Type local:EditorVisual}">
    <Setter Property="Background" Value="LightGreen" />
    <!-- Uncomment to make things work -->
    <!-- <Setter Property="AllowDrop" Value="True" /> -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:EditorVisual}">
                <Border Background="{TemplateBinding Background}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>    

AllowDrop最終的に、プロパティを設定する方法に絞り込みました。xamlまたはデフォルトのスタイルで設定すると、すべてが適切に機能します...混乱します。カスタム コントロールでドラッグ アンド ドロップ イベントを受け取るには、メタデータ オーバーライドを使用するだけでは不十分なのはなぜですか?

編集:任意の CPU で .Net 4.0 を使用して Visual Studio 2012 を使用して Windows 8 でテスト済み - デバッグ。

4

2 に答える 2

0

さて、あなたがどのようにテストしようとしたかがわかりました。

実際、ドラッグ アンド ドロップを機能させたい場合は、AllowDrop を true に設定する必要があります。ただし、AllowDrop は継承フラグを許可するフレームワーク プロパティであるため、ControlTemplate 内のすべてのコントロールの AllowDrop も true に設定されています。

現在、WPF では、継承フラグをサポートするフレームワーク プロパティのメタデータをオーバーライドできません。それを行うと、継承しているプロパティを殺します。

これを解決する方法は 2 つあります。

  1. コンストラクターで値を設定します。

    public EditorVisual() { this.AllowDrop = true; }

  2. スタイルに値を設定します (これは既に持っているものです)。

于 2013-10-01T08:37:15.930 に答える