为了账号安全,请及时绑定邮箱和手机立即绑定

从视图模型(C#)对WPF中的TextBox设置焦点

从视图模型(C#)对WPF中的TextBox设置焦点

C#
幕布斯6054654 2019-06-28 17:02:00
从视图模型(C#)对WPF中的TextBox设置焦点我有一个TextBox和一个Button在我看来。现在,我在单击按钮时检查一个条件,如果条件结果为false,则向用户显示消息,然后我必须将光标设置为TextBox控制室。if (companyref == null){     var cs = new Lipper.Nelson.AdminClient.Main.Views.ContactPanels.CompanyAssociation();      MessageBox.Show("Company does not exist.", "Error", MessageBoxButton.OK,                     MessageBoxImage.Exclamation);     cs.txtCompanyID.Focusable = true;     System.Windows.Input.Keyboard.Focus(cs.txtCompanyID);}上面的代码在ViewModel中。这个CompanyAssociation视图名。但是游标没有被设置在TextBox.XAML是:<igEditors:XamTextEditor Name="txtCompanyID"                           KeyDown="xamTextEditorAllowOnlyNumeric_KeyDown"                          ValueChanged="txtCompanyID_ValueChanged"                          Text="{Binding Company.CompanyId,                              Mode=TwoWay,                              UpdateSourceTrigger=PropertyChanged}"                          Width="{Binding ActualWidth, ElementName=border}"                          Grid.Column="1" Grid.Row="0"                          VerticalAlignment="Top"                          HorizontalAlignment="Stretch"                          Margin="0,5,0,0"                          IsEnabled="{Binding Path=IsEditable}"/><Button Template="{StaticResource buttonTemp1}"         Command="{Binding ContactCommand}"         CommandParameter="searchCompany"         Content="Search"         Width="80"         Grid.Row="0" Grid.Column="2"         VerticalAlignment="Top"         Margin="0"         HorizontalAlignment="Left"         IsEnabled="{Binding Path=IsEditable}"/>
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

我知道这个问题已经被回答了上千次,但我对安瓦卡的贡献做了一些修改,我认为这将帮助其他有类似问题的人。

首先,我更改了上述附加财产如下:

public static class FocusExtension{
    public static readonly DependencyProperty IsFocusedProperty = 
        DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(FocusExtension), new FrameworkPropertyMetadata(IsFocusedChanged){BindsTwoWayByDefault = true});

    public static bool? GetIsFocused(DependencyObject element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        return (bool?)element.GetValue(IsFocusedProperty);
    }

    public static void SetIsFocused(DependencyObject element, bool? value)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        element.SetValue(IsFocusedProperty, value);
    }

    private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var fe = (FrameworkElement)d;

        if (e.OldValue == null)
        {
            fe.GotFocus += FrameworkElement_GotFocus;
            fe.LostFocus += FrameworkElement_LostFocus;
        }

        if (!fe.IsVisible)
        {
            fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged);
        }

        if ((bool)e.NewValue)
        {
            fe.Focus();
        }
    }

    private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var fe = (FrameworkElement)sender;
        if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty))
        {
            fe.IsVisibleChanged -= fe_IsVisibleChanged;
            fe.Focus();
        }
    }

    private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e)
    {
        ((FrameworkElement)sender).SetValue(IsFocusedProperty, true);
    }

    private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e)
    {
        ((FrameworkElement)sender).SetValue(IsFocusedProperty, false);
    }}

我添加可见性引用的原因是选项卡。显然,如果您在初始可见选项卡之外的任何其他选项卡上使用附加属性,则附加属性在手动聚焦控件之前无法工作。

另一个障碍是创建一种更优雅的方法,当基础属性失去焦点时,将其重置为false。这就是失去焦点事件出现的原因。

<TextBox            
    Text="{Binding Description}"
    FocusExtension.IsFocused="{Binding IsFocused}"/>



查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 1240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信