C#所附事件的行为不符合预期
我正在通过一本推荐书学习WPF。我在“第9小时”中处理C#所附事件的行为不符合预期,c#,wpf,C#,Wpf,我正在通过一本推荐书学习WPF。我在“第9小时”中处理RoutedEvents。下面的代码是我从书中输入的。据我所知,ButtonBase.Click是按钮调用的附加事件。这正是我所期待的 <StackPanel ButtonBase.Click="StackPanel_Click"> <Button Content="Red" Foreground="Red"/> <Button Content="Green" Foreground="Green"
RoutedEvents
。下面的代码是我从书中输入的。据我所知,ButtonBase.Click是按钮调用的附加事件。这正是我所期待的
<StackPanel ButtonBase.Click="StackPanel_Click">
<Button Content="Red" Foreground="Red"/>
<Button Content="Green" Foreground="Green"/>
<Button Content="Blue" Foreground="Blue"/>
<TextBlock x:Name="Output"
HorizontalAlignment="Center"
Text="What color will you choose?"/>
</StackPanel>
private void StackPanel_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)e.Source;
Output.Text=string.Format(
$"You choose the color {button.Content}"
);
Output.Background = button.Foreground;
}
按下按钮时,消息框也会出现。有人能帮我澄清我不明白的地方吗
<StackPanel ButtonBase.Click="StackPanel_Click"
TextBoxBase.LostFocus="StackPanel_LostFocus">
<Button Content="Red" Foreground="Red"/>
<Button Content="Green" Foreground="Green"/>
<Button Content="Blue" Foreground="Blue"/>
<TextBox HorizontalAlignment="Center">Here's some text.</TextBox>
<TextBlock x:Name="Output"
HorizontalAlignment="Center"
Text="What color will you choose?"/>
</StackPanel>
private void StackPanel_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)e.Source;
Output.Text=string.Format(
$"You choose the color {button.Content}"
);
Output.Background = button.Foreground;
}
private void StackPanel_LostFocus(object sender, RoutedEventArgs e)
{
MessageBox.Show("The text box has lost focus.");
}
TextBoxBase.LostFocus
实际上是与LostFocus
完全相同的事件-它是在ui元素
类中定义的,该类是TextBoxBase
和按钮
的公共基类,即TextBoxBase/TextBox类不定义自己的LostFocus
事件。它从UIElement
类继承LostFocus
事件
因此,此处发生的情况是,当您单击按钮时会引发LostFocus
事件,因为之前单击的按钮或之前聚焦的元素在单击按钮时确实会丢失。您同时拥有这两个元素,因此这两个元素都将触发它:`ButtonBase.click=“StackPanel\u click”TextBoxBase.LostFocus=“StackPanel\u LostFocus”>`我想确保我理解你的答案。并分别从UIElement
和Control
继承事件LostFocus
。如果我只想让事件触发器用于文本框
,或任何其他元素,我必须选择一个不共享的事件?控件也从UIElement继承,因此只有一个LostFocus事件。是的,如果您想让事件触发器仅用于TextBox,则必须选择一个特定于TextBox类且仅由TextBox引发的事件。在按钮库
上,我可以在继承层次结构中找到System.Windows.UIElement
,但在控件
上找不到它。在事件部分中,没有任何链接说明它从何处继承。如何确定控件从UIElement继承它?我想确保我知道如何正确导航MSDN,并且没有遗漏任何内容。控件派生自FrameworkElement,后者派生自UIElement。检查这里的继承层次结构:请耐心听我说。我会尽我所能清楚地说明。。。使用您的链接我清楚地看到了继承,谢谢<代码>系统.Windows.Controls.Primitives.TextBoxBase
就是您所指的。我在看System.Windows.Forms.TextBox
,它的继承形式是控件
。根据所使用的TextBoxBase
(来自原语或表单),这可能会导致我在继承方面的明显差异。我想确保我完全理解了这一点。