我在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
无法提供帮助。
答案 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();
}
这仍然是解决这个问题的一个黑客,但如果没有更好的解决方案,我将使用它。