双击DataGridTemplateColumn中的ListBox打开窗口 - 在下面打开

时间:2014-04-08 10:15:45

标签: wpf listbox

我在DataTemplateColumn中定义了ListBox:

<Window x:Class="DoubleclickTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataGrid Name="dg" IsReadOnly="True" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ListBox Loaded="ListBox_Loaded" MouseDoubleClick="ListBox_MouseDoubleClick" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Window>

我想在双击列表框时打开一个新窗口:

public MainWindow() {
    InitializeComponent();
    dg.ItemsSource = new[] { 1, 2, 3, 4, 5 };
}

private void ListBox_Loaded(object sender, RoutedEventArgs e) {
    ((ListBox)sender).ItemsSource=Enumerable.Range(1,5);
}

private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
    e.Handled = true;
    var win = new MainWindow();
    win.Show();
    //Neither of these help:
    //win.Activate();
    //win.Focus();
}

新窗口将在当前窗口下方打开。

如何在当前窗口中打开新窗口(不使用ShowDialog)?

更新

使用ItemsControl代替ListBox无法提供帮助。

2 个答案:

答案 0 :(得分:0)

这是一种奇怪的行为,但以下方法会有所帮助:

<Window ... Loaded="Window_Loaded">

使用计时器激活窗口:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Timer t = new Timer(10);
    t.Elapsed += t_Elapsed;
    t.Start();
}

void t_Elapsed(object sender, ElapsedEventArgs e)
{
    (sender as Timer).Stop();
    Dispatcher.Invoke(() =>
    {
        this.Activate();
        this.Focus();
    });
} 

使用的计时器是系统计时器:

using System.Timers;

答案 1 :(得分:0)

使用.NET 4.5:

private async void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
    e.Handled = true;
    await Task.Delay(20);
    var win = new MainWindow();
    win.Show();
}

这仍然是解决这个问题的一个黑客,但如果没有更好的解决方案,我将使用它。

相关问题