我正在创建一个自定义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="&gt;Enter Name&lt;"/>
        </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/

10-11 22:29
查看更多