我正在创建一个自定义UserControl,以在DataGrid编辑模板中使用。
看起来像这样:
<UserControl
x:Class="HR.Controls.UserPicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock x:Name="PART_TextBox" Text="Hello WOrld" />
<Popup Width="234" Height="175" IsOpen="True" StaysOpen="True"
Placement="Bottom"
PlacementTarget="{Binding ElementName=PART_TextBox}"
>
<TextBox
x:Name="searchTextBox"
Text=">Enter Name<"/>
</Popup>
</Grid>
</UserControl>
编辑:
我将代码范围缩小了一点。
看来,如果我将带有文本框的Popup直接放在CellEditingTemplate内,则文本框将获得焦点没有问题。当我将该代码移到UserControl中时,在编辑单元格时无法再选择文本框。
UserControl对焦点做一些有趣的事情吗?
问题是,当我在数据网格中编辑单元格时,出现了用户控件,但无法单击TextBox searchTextBox。当我单击它时,弹出窗口关闭,并且该单元格恢复为默认状态。
我尝试将所有代码复制并粘贴到用户控件中,然后将其直接粘贴到CellEditingTemplate中,这将以应有的方式进行交互。
我只是想知道UserControl是否做一些奇怪的事情来阻止弹出窗口获得焦点,因为当直接放置在CellEditingTemplate中时,弹出窗口可以按预期工作吗?
谢谢,
劳尔
最佳答案
我有一个类似的问题,当单击它的某些区域时,作为单元格编辑模板嵌入在Popup
中的UserControl
将关闭。问题原来是WPF工具包(大概是WPF4)DataGrid
在鼠标左键单击时非常贪婪。即使当您处理它们并将Handled设置为true时,网格也可以将它们解释为单击到其他单元格中。
此thread具有完整的详细信息,但解决方法是挂接到DataGrid.CellEditEnding
事件并取消结束编辑:
private static void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (e.Column.GetType() == typeof(DataGridTemplateColumn))
{
var popup = GetVisualChild<Popup>(e.EditingElement);
if (popup != null && popup.IsOpen)
{
e.Cancel = true;
}
}
}
private static T GetVisualChild<T>(DependencyObject visual)
where T : DependencyObject
{
if (visual == null)
return null;
var count = VisualTreeHelper.GetChildrenCount(visual);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(visual, i);
var childOfTypeT = child as T ?? GetVisualChild<T>(child);
if (childOfTypeT != null)
return childOfTypeT;
}
return null;
}
对此的全部功劳归功于Actipro thread。
关于wpf - WPF Popup专注于数据网格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1784977/