有一个WPF应用程序,它有一个悬停弹出窗口。弹出窗口包含可以打开的不同文件列表(例如pdf,excel等)
您可以通过双击导航并选择文件,然后按预期打开。
但如果我现在导航到另一个文件,我可以看到悬停选择现在不起作用,
如果您现在选择其他文件,则会再次打开原始文件。
我正在使用Process.Start并将文件的完整路径传递给方法。
该应用程序的大小合适,所以这里有一些我已编写的测试应用程序的摘录
主窗口的XAML
<Window x:Class="TestPopupIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas Margin="5" Background="Red" Width="200" Height="150" >
<Rectangle Name="rectangle1"
Canvas.Top="60" Canvas.Left="50"
Height="85" Width="60"
Fill="Black" MouseEnter="rectangle1_MouseEnter" MouseLeave="rectangle1_MouseLeave" />
<Popup x:Name="PopupWindow" PlacementTarget="{Binding ElementName=rectangle1}" Placement="Top" MouseEnter="rectangle1_MouseEnter" MouseLeave="rectangle1_MouseLeave">
<ListBox MinHeight="50" ItemsSource="{Binding Files}" MouseDoubleClick="FileList_MouseDoubleClick"`enter code here` x:Name="FileList" />
</Popup>
</Canvas>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
FileList f;
public MainWindow()
{
InitializeComponent();
f = new FileList();
f.PopulateFiles();
this.DataContext = f;
}
private void FileList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (FileList.SelectedItem != null)
{
string item = FileList.SelectedItem as string;
if (item != null)
{
System.Diagnostics.Process.Start(item);
}
}
}
private void rectangle1_MouseEnter(object sender, MouseEventArgs e)
{
PopupWindow.IsOpen = true;
}
private void rectangle1_MouseLeave(object sender, MouseEventArgs e)
{
PopupWindow.IsOpen = false;
}
}
还有一个FileList类,它只有一个名为的文件路径的通用字符串列表 文件
由于
答案 0 :(得分:1)
当您使用Process打开文件时,我已经测试了您的Sample-Application。启动您的Focus会被打开您的文件的应用程序窃取。 不知何故,当Window失去焦点时,Popup中的ListBox无法更改其SelectedItem。
不幸的是我没有设法把焦点重新放在Window上,这个.SetFocus()对我没用。
无论如何,另一个可能的解决方案是在打开文件时关闭弹出窗口。
private void FileList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (FileList.SelectedItem != null)
{
string item = FileList.SelectedItem as string;
if (item != null)
{
System.Diagnostics.Process.Start(item);
PopupWindow.IsOpen = false;
}
}
}
这样ListBox可以再次更新selectedItem。
希望这有帮助!