我是WPF的新手,我正在尝试编写一个基本上是TextBlock的自定义控件,但也有一个click事件。我尝试从各种来源拼凑这个东西,但它不起作用。
在下面的代码中,我希望在对元素执行鼠标单击时调用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 ); }
}
}
}
答案 0 :(得分:0)
正如@menty指出的那样,代码中没有错误,我在测试Control时犯了一个错误。在XAML中测试它我输入了一个值,因为否则控件将没有高度和宽度(使用自动调整大小)
我的代码是
<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}" />
这种方式有效,控件在设计师中可见。