WPF:如何弹出一个用户控件?

8
背景: 我有一个使用数据网格来展示数据的项目,数据网格有一个行详细列,其中包含一个用户控件。该用户控件有一些文本框用于用户输入和显示一些信息。
问题: 我想在点击按钮时弹出用户控件,并且弹出的用户控件具有与数据网格行详细列中的用户控件相同的上下文。这样做的意图是为了使用户易于与用户控件交互,因为行详细单元格的空间有限。
用户控件已经实现,并且可以在行详细单元格中正常工作。然而,我不知道如何弹出它而不改变它的上下文,比如数据源、在文本框中显示的消息等等。是否有人能给我一些建议? 顺便说一下,我使用MVVM模式。
编辑: 以下是行详细模板:
    <DataTemplate x:Key="RowDetailTemplate">
    <Grid x:Name="RowDetailGrid" HorizontalAlignment="Left" Width="850" Height="355" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="100" />
        </Grid.ColumnDefinitions>
        <my:MyUserControl x:Name="myUserControl" />
        <Button Grid.Row="1" Width="60" Height="25" Content="Pop Up" 
                    Command="{Binding Path=PopupCommand}"/>
        .....
    </Grid>
</DataTemplate>

以下是用户控件(在上述代码中为MyUserControl)的内容:
<UserControl x:Class="MyProject"
         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="600">
<Grid>
    <ScrollViewer  Margin="0" HorizontalScrollBarVisibility="Disabled" >
        <StackPanel>
            <ItemsControl Grid.Row="0" ItemsSource="{Binding Output, Mode=OneWay}" FontSize="12">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                            <TextBlock TextWrapping="Wrap" Text="{Binding Path=.}" Foreground="White" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <DockPanel Grid.Row="1" LastChildFill="True">                    
                <TextBox Text="{Binding Input, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                     TextWrapping="Wrap"
                     BorderBrush="{x:Null}" SelectionBrush="{x:Null}" 
                     BorderThickness="0" Width="Auto">
                    <TextBox.InputBindings>
                        <KeyBinding Command="{Binding Path=TextBoxEnter}" Key="Enter" />
                    </TextBox.InputBindings>
                </TextBox>
            </DockPanel>
        </StackPanel>
    </ScrollViewer>
</Grid>


你能分享一下你的datagrid和usercontrol的代码吗? - Nitin
你不能在messageBox上用你的用户控件实现它吗? - ThomasFey
2个回答

9
您可以使用Popup控件。将Popup附加到您的数据表中的当前行,当您单击按钮时,创建弹出窗口并将其放置在所在行的一个单元格下面是一个不错的选择。
然后,您可以将用户控件添加到弹出窗口中,然后“显示”弹出窗口。这样,弹出窗口的DataContext以及用户控件的DataContext就会从数据表中包含的行继承而来。
以下是一个非常简单的使用XAML实现Popup控件的示例:
<StackPanel>
  <CheckBox Name="chk1"/>
  <Popup IsOpen="{Binding IsChecked, ElementName=chk1}">
    <Border Background="White">
      <TextBlock Margin="20" Text="I'm Popped Up!"/>
    </Border>
  </Popup>
</StackPanel>

弹出窗口包含在stackpanel中,但仅在复选框被选中时才可见(IsOpen)。您可以将用户控件放在弹出窗口中,我在这里放置的是边框和文本块。由于弹出窗口是stackpanel的成员,如果它没有自己的数据上下文,则自动使用stackpanel的数据上下文。
在您的示例中,我展示的stackpanel类似于您的DataGrid行。

嗨,我从未使用过弹出控件。你能给我一些简单的例子吗?谢谢。 - Gate Luma
使用弹出控件是个好主意。但我不知道它是否可以像普通窗口一样添加系统菜单,例如关闭、最大化和还原。 - Gate Luma

1
我想对Gate Lumas的评论进行评论,但系统不允许我这样做,因此我将其作为答案提交。
XAML弹出窗口示例:链接存档 | 原始链接 如果您下载该示例并查看Senario1的.xaml和.cs文件,则可以完美地了解如何使用和实现弹出窗口的示例。或者,您可以只浏览网站上的代码,但我发现运行和与示例交互比仅查看代码更有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接