Wpf - 单击按钮

时间:2017-01-15 13:07:53

标签: c# wpf

我有一个窗口页面,点击窗口页面的按钮后 - &gt;然后显示一个UserControl页面。在Inside UserControl之后,有一个<Popup Name="MyPopup">弹出窗口。 Popup始终处于最重要的问题。我该如何解决这个问题?

我试过了,

&#13;
&#13;
<Window x:Class="WpfApplication1.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" Background="Green">
    <Grid >
        <Button Height="50" Width="100" Content="window_ClickMe" Click="btnUserManage_Click"></Button>
          <ContentControl Name="cont2" Visibility="Hidden">
          
        </ContentControl>
    </Grid>
    
</Window>
&#13;
&#13;
&#13;

和窗口页面后面的代码,

private void btnUserManage_Click(object sender, RoutedEventArgs e)
    {
        UC_UserMgmt mw = new UC_UserMgmt();
        cont2.Content = mw;
        cont2.Visibility = Visibility.Visible;
    }

然后,这是带有弹出窗口的用户控制页面,

&#13;
&#13;
<UserControl x:Class="WpfApplication1.UC_UserMgmt"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="400" Background="Blue">
 
        <Grid>
        <Grid Name="g1">
            <Button Content="usercontrol_ClickMe" Height="50" Width="150" Margin="150,0,0,250" Click="btnShow_Click"></Button>
           
        </Grid>
               <Popup Name="MyPopup" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
                              HorizontalOffset="-150" Placement="Mouse" StaysOpen="{Binding ElementName=g1,Path=IsMouseOver}"
               VerticalOffset="20"
               AllowsTransparency="True">
        <StackPanel>
            <Border BorderBrush="Black" Background="Brown" BorderThickness="1" Width="300" Height="100" >
                <Grid>
                    <TextBox x:Name="txtUName" HorizontalAlignment="Center" Height="28" Width="223" TextWrapping="Wrap" VerticalAlignment="Top" Margin="10,26,64.6,0" />
                    <Button Content="Open" Height="30" Width="50" Margin="238,24,9.6,43.6" Click="btnOpen_Click"/>
                </Grid>
            </Border>
        </StackPanel>
        </Popup>
    </Grid>
</UserControl>
&#13;
&#13;
&#13;

这是usercontrol页面的代码,

private void btnOpen_Click(object sender, EventArgs e)
    {
         MyPopup.IsOpen = true;
         System.Windows.Forms.OpenFileDialog fDialog = new System.Windows.Forms.OpenFileDialog();
         fDialog.Title = "Select file to be zip";
         if (fDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
         {
             txtUName.Text = fDialog.FileName.ToString();
         }
    }  

    private void btnShow_Click(object sender, EventArgs e)
    {
        MyPopup.IsOpen = true;
    }

问题是,当用户点击OPEN按钮时,openFileDialog正在打开,当它打开时,弹出窗口似乎消失了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我相信在您的情况下使用Popup不是正确的选择。看看Popup.StaysOpen Property,特别是

部分
  

当StaysOpen属性设置为true时,Popup将保持打开状态,直到通过将IsOpen属性设置为false来显式关闭它。当StaysOpen为false时,Popup控件拦截所有鼠标和键盘事件,以确定其中一个事件何时发生在Popup控件之外。

我无法想到在显示对话框时保持弹出窗口打开的简洁方法,因为对话框将在您与其交互时创建鼠标/键盘事件

但是要回答你的问题,我可以想到两个选择

1)您只需将MyPopup.IsOpen = true;中的btnOpen_Click移至代码块的末尾即可。我认为这会导致弹出窗口在关闭对话框后重新打开

2)您可以在代码中创建布尔属性或依赖属性,然后在显示弹出窗口并将Popup的 StaysOpen 绑定到它时将其设置为true,并在 LostFocus 用于 g1 或类似的东西。或者甚至将 StaysOpen 设置为 true 并使用 IsOpen 关闭 g1 LostFocus <中的Popup /强>

编辑 - 第二个解决方案操作方法 不要使用它,脏代码,不良做法,弹出窗口仍在对话框顶部

在弹出集StaysOpen="True"中 在UserControl中的每个控件中,除了UserControl本身和文本框集Focusable="False"
private bool dont;添加到UserControl的代码隐藏中,并在btnOpen_Click的开头将其设置为 True ,并将其设置为 False /> 在UserControl和TextBox中添加LostFocus="UserControl_LostFocus"
然后在UserControl代码隐藏

中添加此功能
private void UserControl_LostFocus(object sender, RoutedEventArgs e)
{
    if(!dont && !txtUName.IsFocused && !IsFocused)
        MyPopup.IsOpen = false;
}