打开文件时WPF列表选择问题

时间:2013-02-25 15:16:09

标签: wpf popup process.start

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

由于

1 个答案:

答案 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。

希望这有帮助!