首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改FocusManager.FocusedElement

动态更改FocusManager.FocusedElement
EN

Stack Overflow用户
提问于 2013-03-10 18:07:09
回答 2查看 9.8K关注 0票数 2

我有如下的WPF xaml代码:

代码语言:javascript
复制
  <StackPanel  FocusManager.FocusedElement="{Binding FocusedElement}">
    <TextBox Name="txtbox1" Text="FirstText"/>
    <TextBox Name="txtbox3" Text="SecondText"/>
    <TextBox Name="txtbox2" Text="ThirdText"/>
  </StackPanel>

如何在ViewModel中将FocusedElement绑定到属性?类似的代码如下:

代码语言:javascript
复制
Switch(Type)
{
Case "FirstType" :
  FocusedElement = "txtbox1";
break;
Case "SecondType" :
   FocusedElement = "txtbox2";
break;
Case "ThiredType" :
   FocusedElement = "txtbox3";
break;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-11 00:56:07

视图模型永远不应该知道视图,当然也不应该知道一些UIElement名称。但是考虑到视图模型确实需要能够管理焦点(我建议您在继续之前确保确实如此),您可以这样做:

ViewModel:

代码语言:javascript
复制
public enum Focuses
{
    None = 0,
    First,
    Second,
    Third
}

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private Focuses _focusedElement;
    public Focuses FocusedElement { get { return _focusedElement; } set { _focusedElement = value; OnPropertyChanged("FocusedElement"); } }


    public ViewModel()
    {
        this.FocusedElement = Focuses.Second;
    }
}

Xaml:

代码语言:javascript
复制
<StackPanel >
    <TextBox Name="txtbox1" Text="FirstText"/>
    <TextBox Name="txtbox2" Text="SecondText"/>
    <TextBox Name="txtbox3" Text="ThirdText"/>
    <StackPanel.Style>
        <!-- cannot use DataTriggers directly in StackPanel.Triggers, therefore Style -->
        <Style TargetType="{x:Type StackPanel}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding FocusedElement}" Value="First">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox1}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding FocusedElement}" Value="Second">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox2}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding FocusedElement}" Value="Third">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtbox3}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Style>
</StackPanel>
票数 6
EN

Stack Overflow用户

发布于 2013-03-10 18:17:26

FocusedElement是具有特定焦点范围的逻辑焦点的元素。

逻辑焦点而不是“真正的焦点”,如txtBox1.Focus();

逻辑焦点可以设置多次,而只有一个元素可以有键盘焦点。

你真的需要逻辑焦点吗?

例如,您可以侦听GotFocus事件,然后执行一些自定义逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15321047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档