WPF设置焦点问题

时间:2012-11-20 02:26:25

标签: c# wpf mvvm focus

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

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

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

然后当我完成后,我关闭了usercontrol和Dispose of DataContext。现在我遇到的问题是我似乎无法使焦点设置正常工作,我在usercontrol中有一个Textbox,我希望在视图变为Visible时将焦点设置为。然而,在我第一次尝试设置焦点时,它只在文本框中填充了一个不透明的插入符号,经过调查后让我相信这是因为TB没有获得键盘焦点(只有逻辑焦点),但是在明确设置键盘焦点之后,我仍然得到了不眨眼的插入符号,并且只有在点击TB之后它才会获得焦点。我用来设置焦点的方法类似于描述的方法here
如果在视图中我通过在文本框的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>

和UserControl 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后设置。

2 个答案:

答案 0 :(得分: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

我希望这会有所帮助。

答案 1 :(得分: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");

        }
    }

更改之后一切正常:/但如果有人能向我解释为什么我所遇到的这种烦恼是由于我会非常感激:)