簡體   English   中英

Avalonia 焦點導致焦點丟失

[英]Avalonia Focus Causing Focus Loss

我正在嘗試設置一個文本塊,當有人在上下文菜單中單擊“編輯”時,它會將文本塊換成文本框,以便用戶可以編輯該字段中的內容。

到目前為止,我的方法是將兩個控件都放在一個網格中,並通過將它們都綁定到 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);
        }
    }

當有人單擊菜單項時,我將 IsEditing bool 設置為 True 導致 TextBox 變得可見

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

然后我正在觀察 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();
                }
            }
        }

當文本框上的焦點丟失時,我將 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";
            }
        }

我有一個小調試文本框來試圖弄清楚發生了什么......看起來焦點被設置到文本框然后立即丟失我不確定是什么可能導致這里的焦點丟失。

這只發生在我將焦點強制到文本框時。 在此處輸入圖像描述

如果我刪除線tb.Focus(); 不會立即失去焦點,但焦點未設置到文本框,因此用戶可以立即開始輸入

在此處輸入圖像描述

我有一個重現問題設置here的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM