【问题标题】:WPF image's gotfocus/lostfocus event does not firedWPF 图像的 gotfocus/lostfocus 事件未触发
【发布时间】:2014-07-07 13:07:48
【问题描述】:

请您帮帮我,为什么当我点击图像然后点击文本框时 GotFocus 和 LostFocusa 事件没有触发?

我的 XAML:

<Window x:Class="imageclick.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Image Source="Untitled.png" GotFocus="GF" LostFocus="LF" Focusable="True"></Image>
            <TextBox ></TextBox>
        </StackPanel>
    </Grid>
</Window>

我不明白为什么 GotFocus/LostFocus 事件从未触发

提前致谢

更新:当我设置 tabindex 时,当 tab 到达触发图像事件时,但我无法通过鼠标单击到达

【问题讨论】:

  • 我猜 Image 根本无法聚焦。您可能需要将 Image 标记包装在“可聚焦”元素中。
  • 我发现了以下几点: Image 类不是真正的控件类,因为它不是 Control 的后代类。您不能将焦点调用到 Image 元素,或将 Image 元素放在制表符序列中。我可以使用哪个元素来包装图像?

标签: c# wpf events


【解决方案1】:

图片不是 Control。只有 Controls 可以获得 focus。使用 MouseEnterMouseLeave 事件,而不是 GotFocus 和 LostFocus,

 <StackPanel>
            <Image Stretch="Uniform" Source="Untitled.png"   Height="410" MouseEnter="Image_MouseEnter" MouseLeave="Image_MouseLeave"></Image>
            <TextBox Height="65"></TextBox>
 </StackPanel>

【讨论】:

  • 谢谢,但我想以某种方式表明图像被选中而不是。例如图像外的边框,如果它被选中
【解决方案2】:

根据MSDN,UIElement.GotFocus 事件在此元素获得逻辑焦点时发生。

并且逻辑焦点不同于键盘焦点,当路由中元素的IsFocused属性的值从false变为true时会引发。

所以,为了通过鼠标点击来实现,需要处理各自的鼠标按键事件或者干脆处理MouseDown并将焦点设置给发送者。

private void Image_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (sender is Image)
        {
            (sender as Image).Focus();
        }
    }

这会将 Image 的 IsFocused 属性设置为 true

【讨论】:

  • 这是个坏主意,因为有多种方法可以改变焦点。如果您按 Tab 键切换到不同的控件等,则必须捕获所有这些场景才能正确实现 gotfocus / lostfocus。
  • 由于 Image 的行为在这里有点奇怪,这是丑陋的 hack,以实现理想的输出。除了处理GotFocusLostFocus,如果我们处理MouseDown;它工作正常。我相信,还有很多其他方法可以达到同样的效果,但这也很有效。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2017-05-09
  • 2014-09-29
  • 2012-12-20
相关资源
最近更新 更多