1

私はWPFにかなり慣れていないので、基本的にTextBlockであるが、クリックイベントもあるカスタムコントロールを作成しようとしています。いろいろなソースからつなぎ合わせてみましたが、うまくいきません。

次のコードではOnMouseLeftButtonDown、要素に対してマウスクリックが実行されたときに呼び出されると思います。その場合は、Clickイベントを開催したいと思います。デバッガーを見ると、関数が呼び出されることはありません。

これがどのように機能するかを誤解しましたか、それとも他のエラーが私のコードへの道を見つけましたか?

namespace EP3_gui.Controls
{
    public class ClickableTextBlock : TextBlock
    {
        public ClickableTextBlock() : base()
        { }

        public ClickableTextBlock( Inline inline )
            : base( inline )
        { }

        protected override void OnMouseLeftButtonDown( MouseButtonEventArgs e )
        {
            base.OnMouseLeftButtonDown( e );
            RoutedEventArgs args = new RoutedEventArgs( ClickEvent );
            RaiseEvent( args );
        }

        public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
            "Click",
            RoutingStrategy.Bubble,
            typeof( RoutedEventHandler ),
            typeof( ClickableTextBlock )
        );

        public event RoutedEventHandler Click
        {
            add { AddHandler( ClickEvent, value ); }
            remove { RemoveHandler( ClickEvent, value ); }
        }
    }
}
4

1 に答える 1

0

@mentyが指摘したように、コードにエラーはありません。コントロールをテストするときに間違いを犯しました。テストするXAMLで値を入力しました。そうしないと、コントロールに高さと幅がなかったためです(サイズにAutoを使用)

私のコードは

 <cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value}">0<cc:ClickableTextBlock>

それをに変更した場合

 <cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value}" />

それは機能しますが、デザイナーで要素を見ることができません。私の場合、親ユーザーコントロールのサイズがに設定されていたため、非常に悪かったautoため、デザイナーではコントロール全体が間違って見えました。

解決策は、バインディングのデフォルト値を提供することです。

 <cc:ClickableTextBlock x:Name="bit3" ... Click="bitText_Click" Text="{Binding Value, FallbackValue=0}" />

このように機能し、コントロールがデザイナーに表示されます。

于 2012-11-08T01:07:04.147 に答える