【问题标题】:TextBox.Focus() only works if I have a MessageBox.Show() after it?TextBox.Focus() 仅在我后面有 MessageBox.Show() 时才有效?
【发布时间】:2012-09-10 15:10:02
【问题描述】:

好吧,显然还有更多内容,但这是基础知识。这似乎是一件很简单的事情,但它不起作用。

我有一个标签。 我有一个文本框。

标签的 ZIndex = "1" TextBox 的 ZIndex = "0"

即它们相互重叠,TextBox 是不可见的。

当用户单击 LABEL 时(现在通过 PreviewMouseLeftButtonDown,但在此“工作”之后将成为 ViewModel 中的命令),应用程序应将焦点设置到 TextBox。

简单吧?错了……

如果我有这个代码......它不起作用。

    private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
        }

如果我有这个代码......它确实有效

 private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
            MessageBox.Show("This is ridiculous");
        }

最后是 XAML:

 <Ctrls:AControl x:Class="<location of class>"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandControls="clr-namespace:<location of custom controls>" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid Margin="0,15,15,15">
        <!--<Button Height="50" Click="Button_Click">FOC</Button>-->
        <TextBox x:Name="inVisTxtBox" Focusable="True" Grid.ZIndex="0" Width="100" Margin="5"/>
        <Label Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" PreviewMouseLeftButtonDown="inVisTxtBox_PreviewMouseLeftButtonDown" 
               x:Name="KeyPress_TextBox"/>
    </Grid>
</Ctrls:AControl>

编辑

如果我将标签制作成带有标签的模板按钮,它的模板就可以工作:

<Button x:Name="KeyPress_TextBox" Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" Click="KeyPress_TextBox_Click">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Label Content="{TemplateBinding Content}"/>
        </ControlTemplate>
    </Button.Template>
</Button>

为什么会这样?

一定与事件路线/泡沫的方式有关?

我现在这样做了……但我更好奇发生了什么。

另外...以下都不起作用:

Keyboard.Focus(inVisTxtBox);
FocusManager.SetFocusedElement(MainGrid,inVisTxtBox);
Keyboard.Focus(inVisTxtBox);

【问题讨论】:

  • 你提到TextBox是不可见的?这是为什么?如果它实际上是不可见的,那么在不使其可见的情况下聚焦它有什么意义?
  • 它本身并不是“隐形的”。它在标签后面。这样做的原因是我正在创建一个“按键”控件,它没有焦点,但会显示用户键入的内容。示例: 1. 用户点击标签。 2. TextBox 获得焦点。 3. 用户开始打字。 4. Label 绑定到 TextBox Text 属性。 5. 标签已更新,但用户看不到闪烁的光标等。
  • 现在我很困惑。但是,如果您要做的只是“单击标签时将焦点设置到 TextBox”,那么上面的代码应该可以工作,而无需 MessageBox。你确定你把事件设置在正确的地方吗?从事件处理器的名字看,好像是为TextBox生成的。
  • 我 100% 同意...代码应该可以工作。你偶然尝试过吗?它不起作用。 TextBox 永远不会获得焦点。光标从不闪烁。永远不会应用键盘焦点。事件命名很奇怪,因为我一直在尝试不同的东西。该事件已正确连接...我已设置断点进行确认。这真的很奇怪。我敢肯定这是一件小事和愚蠢的事情……但我想知道发生了什么。如果我用 BUTTON 替换它,它确实可以工作谢谢

标签: c# .net wpf textbox focus


【解决方案1】:

我复制了你的代码,它对我来说很好,即使使用 previewmouseclick,其他问题似乎也是如此。

在 PreviewMouseLeftButtonDown 事件触发后,可能向上抛出消息框会阻止焦点转移到它要转移到的任何地方。也许 UserControl 本身正在获得焦点?

【讨论】:

  • 没有骰子...我已经尝试了所有可以尝试的鼠标按下事件,并且我也尝试了每一个使用 e.handled = true 的事件。如果你已经为 WPF 打开了你的 DEV 环境,那么如果你想看看我是否疯了,这很容易尝试和复制:)。创建一个标签,创建一个文本框。为标签选择一个 mousedown 事件并说“TextBox”.Focus()
  • @user1631520 我复制了你的代码,它对我来说工作正常,即使使用 previewmouseclick,似乎还有其他问题。
  • 感谢您试用 KDiTraglia。这实际上很有帮助。我刚刚切换到 MouseLeftButtonUP,它现在可以工作了。我的 UserControl 中的某些东西必须一直在吸引焦点。
  • @user1631520 是的,可能将消息框向上抛出会阻止焦点转移到PreviewMouseLeftButtonDown 事件触发后将转移到的任何内容。也许 UserControl 本身正在获得焦点?
  • 如果您可以将您的最后一条评论作为答案发布,我会很乐意将其标记出来。
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2016-05-19
  • 2019-04-21
相关资源
最近更新 更多