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 回答