简体   繁体   English

Avalonia 焦点导致焦点丢失

Avalonia Focus Causing Focus Loss

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文简体   中文繁体   英文版本 版本,有任何建议请联系yoyou2525@163.com。

I'm trying to setup a textBlock, where when someone clicks Edit in a context menu it swaps the textblock out for a textbox so the user can edit what's in that field.我正在尝试设置一个文本块,当有人在上下文菜单中单击“编辑”时,它会将文本块换成文本框,以便用户可以编辑该字段中的内容。

My approach so far has been to have both controls in a grid and swap what is visible by binding them both to a bool in the ViewModel到目前为止,我的方法是将两个控件都放在一个网格中,并通过将它们都绑定到 ViewModel 中的布尔值来交换可见的内容

<Grid RowDefinitions="Auto, Auto">
        <TextBox Text="{Binding Debug}"></TextBox>
        <TextBlock Grid.Row="1" Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center" IsVisible="{Binding !IsEditing}">
            <TextBlock.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Change" Click="MenuItem_OnClick"></MenuItem>
                </ContextMenu>
            </TextBlock.ContextMenu>
        </TextBlock>
        
        <TextBox Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" PropertyChanged="AvaloniaObject_OnPropertyChanged" IsVisible="{Binding IsEditing}" LostFocus="InputElement_OnLostFocus">
            
        </TextBox>
    </Grid>

public class MainWindowViewModel : ViewModelBase
    {
        public string Greeting => "Welcome to Avalonia!";

        private bool _isEditing = false;
        public bool IsEditing
        {
            get => _isEditing;
            set => this.RaiseAndSetIfChanged(ref _isEditing, value);
        }

        private string _debug = "";

        public string Debug
        {
            get => _debug;
            set => this.RaiseAndSetIfChanged(ref _debug, value);
        }
    }

When someone clicks the menu item I set the IsEditing bool to True causing the TextBox to become visible当有人单击菜单项时,我将 IsEditing bool 设置为 True 导致 TextBox 变得可见

private void MenuItem_OnClick(object? sender, RoutedEventArgs e)
        {
            var vm = (MainWindowViewModel)this.DataContext;
            vm.IsEditing = true;
        }

I'm then watching for changes to the IsVisible property so I can force the focus to go to the textbox so the user can immediately start typing in it without having to click on it, that's where my trouble is.然后我正在观察 IsVisible 属性的更改,以便我可以将焦点强制到 go 到文本框,以便用户可以立即开始输入它而无需单击它,这就是我的麻烦所在。

private void AvaloniaObject_OnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
        {
            
            var vm = (MainWindowViewModel)this.DataContext;
            if (vm != null)
            {
                if (e.Property.Name.ToLower().Contains("focus"))
                {
                    vm.Debug += $"{e.Property.Name} changed to {e.NewValue} \n";
                }
            }
            
            if (e.Property.Name == "IsVisible")
            {
                if ((bool)e.NewValue)
                {
                    var tb = (TextBox)sender;
                    tb.Focus();
                }
            }
        }

When the focus on the textbox gets lost, I set the IsEditing bool back to false so the textblock shows back up.当文本框上的焦点丢失时,我将 IsEditing bool 设置回 false,以便文本块重新显示。

private void InputElement_OnLostFocus(object? sender, RoutedEventArgs e)
        {
            var vm = (MainWindowViewModel)this.DataContext;
            if (vm != null)
            {
                vm.IsEditing = false;
                vm.Debug += "Focus was lost on the textbox \n";
            }
        }

I've got a little debug textbox to try to figure out what is happening...it looks like the focus gets set to the textbox and then immediately gets lost I'm not sure what could be causing the focus loss here.我有一个小调试文本框来试图弄清楚发生了什么......看起来焦点被设置到文本框然后立即丢失我不确定是什么可能导致这里的焦点丢失。

This only happens when I force the focus to the textbox.这只发生在我将焦点强制到文本框时。 在此处输入图像描述

If I remove the line tb.Focus();如果我删除线tb.Focus(); that immediate focus loss doesn't happen, but the focus isn't set to the textbox so a user could immediately start typing不会立即失去焦点,但焦点未设置到文本框,因此用户可以立即开始输入

在此处输入图像描述

I've got an example that reproduces the problem setup here我有一个重现问题设置here的示例

问题暂未有回复.您可以查看右边的相关问题.
2 JavaFX 虚拟键盘导致焦点丢失 - JavaFX virtual keyboard causing focus loss

嗨,我正在为树莓派和触摸显示器创建应用程序。 我有一个带有文本区域的简单应用程序。 当我在虚拟键盘内部单击正确显示时,但是当我尝试在其上书写时,它会导致文本区域失去焦点并且键盘隐藏。 我正在使用这些 JVM 选项 该应用程序在没有任何桌面环境的 xserver 中运行。 ...

6 定时器触发更新面板更新导致失去焦点 - Timer triggering update panel update causing loss of focus

我已经制作了一个时钟,用ajax更新面板中的ajax定时器显示当前时间。 计时器设置为一分钟触发滴答事件,将当前时间放在标签中。 页面上有许多文本框,当时钟更新时,光标跳转到默认的聚焦控件,页面跳转到顶部。 这使得在没有中断的情况下填写表格变得困难。 如何保持控制焦点和滚动位置? 我在 ...

7 jQWidgets Splitter Widget导致丢失焦点或事件消耗 - jQWidgets Splitter Widget causing loss focus or event consumption

我正在使用jQWidegts的拆分器,启用拆分器时遇到一些奇怪的行为。 禁用后,奇怪的行为停止。 我已经创建了这个问题的JSFiddle-它很简单。 重新创建问题: 加载JSFiddle,在执行任何操作之前,将鼠标悬停在“提交”按钮或“字符串”选项卡上。 提交按钮会变 ...

9 setDefaultButton-焦点损失 - setDefaultButton - Focus Loss

我发现,当模式JDialog启动第二个模式JDialog并放置第二个JDialog时,第一个JDialog似乎(大部分)忽略了键盘。 我提供了一个示例程序来演示该问题。 在运行代码时,我应该能够按下空格键(主JFrame中的按钮具有焦点),并且启动第一个JDialog,其中包含一个按钮( ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM