我正在运行模式下切换ListViewItem
的内容模板以启用项目编辑。为此,我显示带有“确认”和“取消”选项的Panel
,我需要用户在转到另一个项目之前选择其中任何一个选项。我希望Panel
的行为类似于模态Dialog
。
有什么建议吗?
高级谢谢, DAS
答案 0 :(得分:0)
您可以尝试收听PreviewLostKeyboardFocus事件,并在您不想让焦点消失时将其标记为已处理。这是一个例子。我们有两列,如果您将焦点放在第一列,则在您单击“释放焦点”按钮之前,您永远不会离开它:
<强> XAML 强>
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Focus Sample" Height="300" Width="340">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GroupBox Header="Press Release Focus to leave">
<StackPanel PreviewLostKeyboardFocus="StackPanel_PreviewLostKeyboardFocus">
<TextBox/>
<Button Content="Release Focus"
Click="ReleaseFocusClicked"/>
</StackPanel>
</GroupBox>
<GroupBox Header="Try to switch focus here:"
Grid.Column="1">
<TextBox/>
</GroupBox>
</Grid>
</Window>
<强> C#强>
using System.Windows;
using System.Windows.Input;
namespace WpfApplication1
{
public partial class Window1 : Window
{
private bool _letGo;
public Window1()
{
InitializeComponent();
}
private void StackPanel_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
var uie = (UIElement) sender;
var newFocusDO = (DependencyObject)e.NewFocus;
if (!_letGo && !uie.IsAncestorOf(newFocusDO))
{
e.Handled = true;
}
}
private void ReleaseFocusClicked(object sender, RoutedEventArgs e)
{
_letGo = true;
}
}
}
我正在做一次额外的检查,以确保新的焦点目标是否属于我们的面板。如果我们不这样做,我们永远不会让焦点离开当前关注的元素。值得一提的是,这种方法不会阻止用户点击UI中的其他按钮。它只是关注焦点。
希望这有帮助。
干杯,安瓦卡。