0

基础:我正在使用 MVVM 模式或其子集。

在我的主窗口中,我有一个按钮,可以打开一个带有新 DataContext 的用户控件,该函数看起来有点像这样:

public void SetUserControl()
{
     UCDatacontext = new UCViewModel(this);
     base.OnPropertyChanged("UCDatacontext");
     UCViewVisibilty = Visibility.Visible;
     UCDatacontext.IniFocus(); 
}

然后当我完成后,我关闭用户控件并处理 DataContext。现在我遇到的问题是我似乎无法让焦点设置正常工作,我在用户控件中有一个文本框,我想在视图变为可见时将焦点设置为。然而,在我第一次尝试设置焦点时,它只用一个不闪烁的插入符号填充文本框,经过调查,我相信这是因为 TB 没有获得键盘焦点(只有逻辑焦点),但即使在明确设置键盘焦点后,我仍然得到不眨眼的插入符号,并且只有在点击 TB 之后它才会获得焦点。我用来设置焦点的方法与此处描述的方法类似。
如果在视图中我通过在 FocusSet 事件中打印出它确实设置的文本框来进行一些写行调试,但是仅在我第一次调用 SetUserControl() 时。如果我再次调用 SetUserControl() 它什么也不做,除了使视图可见但不触发焦点设置事件。
以下是 MainWindow 中的代码行:

<Grid Grid.ColumnSpan="5" Grid.RowSpan="5" Visibility="{Binding Path=UCViewVisibilty }" x:Name="UCGrid"   >
    <Grid.Effect>
        <DropShadowEffect  />
    </Grid.Effect>
    <View:UCView DataContext="{Binding Path=UCDatacontext}"   />    
</Grid>

和用户控制网格:

<Grid > 
    <TextBox Uid="UCTB" localExtensions:FocusExtension.IsFocused="{Binding Path=UCTBFocus}" Height="23" HorizontalAlignment="Left" Margin="113,56,0,0" Name="UCTB" VerticalAlignment="Top" Width="165" Text="{Binding Path=UCTBContent, UpdateSourceTrigger=PropertyChanged}" GotFocus="UCTB_GotFocus" />
</Grid >

Focus 在 UserControlViewModel 中设置,在 Usercontrol 渲染后设置。

4

2 回答 2

0

事实证明,在摆弄代码之后,在 View 中没有正确设置焦点的原因是因为 View Model 中的绑定是这样的:

    bool _tBfocus;
    public bool UCTBFocus
    {
        get { return _tBfocus; }
        set
        {
            _tBfocus= value;
            base.OnPropertyChanged("UCTBFocus");

       }

代替:

    bool _tBfocus;
    public bool UCTBFocus
    {
        get { return _tBfocus; }
        set
        {
            if (_tBfocus == value)
                return;
            _tBfocus= value;
            base.OnPropertyChanged("UCTBFocus");

        }
    }

更改后一切正常:/但如果有人可以向我解释为什么我所遇到的这种烦恼是由此引起的,我将不胜感激:)

于 2012-11-20T20:53:33.850 回答
0

像这样从上到下一一设置焦点。

InitializeComponent();
        FocusManager.SetFocusedElement(this, TabItem); //this is Window , TabItem is UserControl in this Window
        FocusManager.SetFocusedElement(TabItem, TextBox); // TabItem is UserControl and TextBox is Control in TabItem UC

我希望这将有所帮助。

于 2012-11-20T05:18:49.107 回答