C#所附事件的行为不符合预期

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"

我正在通过一本推荐书学习WPF。我在“第9小时”中处理
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
(来自原语或表单),这可能会导致我在继承方面的明显差异。我想确保我完全理解了这一点。