当输入控件(来自另一个用户控件)在WPF中设置为焦点时,如何在主窗口中显示浮动虚拟键盘(用户控件)?
我已经在使用MVVM模式的WPF应用程序中进行了几天的开发工作。我对WPF和MVVM模式也很陌生 在我的场景中,我有一个用户控件视图(名为EPayView.xaml),它有一个文本框,可以接受电话号码。该视图具有相应的viewmodel(名为EPayViewModel.cs)。在MainWindow.xaml中,我有一个用户控件(浮动虚拟键盘),它派生自命名空间控件WpfKb.controls。MainWindow.xaml还具有相应的viewmodel(名为MainViewModel.cs) 话虽如此,我已经研究了如何使用附加的依赖属性,这使我找到了这个解决方案。我相信这就是我可以绑定属性的地方,它集中在EPayView.xaml的文本框中 下面是我已经在解决方案中包含的代码 EpayView.xaml(文本框xaml标记)当输入控件(来自另一个用户控件)在WPF中设置为焦点时,如何在主窗口中显示浮动虚拟键盘(用户控件)?,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我已经在使用MVVM模式的WPF应用程序中进行了几天的开发工作。我对WPF和MVVM模式也很陌生 在我的场景中,我有一个用户控件视图(名为EPayView.xaml),它有一个文本框,可以接受电话号码。该视图具有相应的viewmodel(名为EPayViewModel.cs)。在MainWindow.xaml中,我有一个用户控件(浮动虚拟键盘),它派生自命名空间控件WpfKb.controls。MainWindow.xaml还具有相应的viewmodel(名为MainViewModel.cs)
MainWindow.xaml(xaml标记)
在上面的代码中,用户控件RollPanel.BottomContent将EPayView.xaml视图托管在另一个视图(RollPanel.xaml)中
EpayViewModel.cs包含IsFocused附加属性的静态类FocusExtension(请参阅此解决方案-)。并且,EPayViewModel.cs已经实现了INotifyPropertyChanged,它被包装在接受T类型的具体类ObserveObject中。这与MainViewModel.cs也是一样的
public class EPayViewModel : ObservableObject<EPayViewModel>, IPaymentViewModel, IActiveViewModel
{ ... }
public class MainViewModel : ObservableObject<MainViewModel>
{ ... }
公共类EPayViewModel:ObserveObject、IPaymentViewModel、IActiveViewModel
{ ... }
公共类MainViewModel:ObserveObject
{ ... }
因此,我的目标是,当EPayView.xaml中的文本框具有焦点时,MainWindow.xaml中的浮动虚拟键盘(floatKb)将显示出来
我一直在思考如何继续(我在想,如果在MainViewModel.cs中调用EPayViewModel中的FocusExtension静态类就足够了?),非常感谢您的帮助
干杯,正如AnjumSKhan已经说过的,要以MVVM的方式对某些事件做出反应,您必须使用命令
。可以在EventTrigger
中调用命令,您需要添加对System.Windows.interactivity
组件的引用。
假设您有一个简单的视图和视图模型,并且需要在主窗口中的文本框获得焦点时显示此视图
查看(NewWindow.xaml)
您还有一个主窗口,它是应用程序的主视图,其中包含目标文本框
。您可能会看到文本框中添加了一个EventTrigger,它有一个属性InvokeCommandAction
,该属性绑定到名为ShowCommand
的MainWindowViewModel
命令
主窗口
<Window x:Class="My.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" Title="MainWindow" Height="350" Width="525">
<TextBox Height="40" Text="{Binding Text}">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="GotFocus">
<Interactivity:InvokeCommandAction Command="{Binding ShowCommand}"/>
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</TextBox>
剩下的就是创建一个新的MainWindowViewModel并为MainWindow设置一个DataContext
public MainWindow()
{
InitializeComponent();
var mvm = new MainWindowViewModel();
mvm.Text = "Focus me!";
DataContext = mvm;
}
希望它能有所帮助。使用
命令
这是一条路。@AnjumSKhan,我该如何使用该命令?我是MVVM的新手。对不起,非常感谢。我还没有试过你的解决办法。但是,我真的很感激。这确实是了解如何使用命令的良好开端。
<Window x:Class="My.NewWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="NewWindow" Height="300" Width="300">
<TextBlock Text="{Binding Message}"/>
public class NewWindowViewModel
{
private string _message;
public string Message
{
get { return _message; }
set { _message = value; }
}
}
<Window x:Class="My.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" Title="MainWindow" Height="350" Width="525">
<TextBox Height="40" Text="{Binding Text}">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="GotFocus">
<Interactivity:InvokeCommandAction Command="{Binding ShowCommand}"/>
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</TextBox>
public class MainWindowViewModel
{
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
private ICommand _increaseCommand;
public ICommand ShowCommand
{
get
{
if (_increaseCommand == null)
{
_increaseCommand = new RelayCommand(
p => true,
Show);
}
return _increaseCommand;
}
}
private void Show(object obj)
{
var w = new NewWindow();
var nvm = new NewWindowViewModel();
nvm.Message = "Test";
w.DataContext = nvm;
w.Show();
}
}
public MainWindow()
{
InitializeComponent();
var mvm = new MainWindowViewModel();
mvm.Text = "Focus me!";
DataContext = mvm;
}