0

有一个 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>

主窗口.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 类,它只有一个名为 Files 的文件路径的通用字符串列表

谢谢

4

1 回答 1

1

我已经测试了您的示例应用程序,当您使用 Process.Start 打开文件时,您的焦点被打开文件的应用程序窃取。当窗口失去焦点时,弹出窗口中的列表框无法更改其 SelectedItem。

不幸的是,我没有设法将焦点重新放在窗口上,this.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。

希望这可以帮助!

于 2013-02-25T16:03:07.317 回答