簡體   English   中英

wpf:如何彈出用戶控件?

[英]wpf: How popup a usercontrol?

背景:我有一個使用datagrid顯示數據的項目,datagrid有一個rowdetail列,其中包含一個usercontrol。 usercontrol有一些TextBox供用戶輸入和顯示一些消息。

問題:我想在單擊按鈕時彈出usercontrol,並且popuped usercontrol與datagrid的rowdetail列中的usercontrol具有相同的上下文。 這樣做的目的是使用戶易於與用戶控件交互,因為rowdetail單元的空間是有限的。

usecontrol已實現,它可以在rowdetail單元格中正常工作。 但是,我不知道如何在不改變其上下文的情況下彈出它,例如數據源,消息已經在TextBox中顯示等等。任何人都可以給我一些建議嗎? 順便說一句,我使用MVVM模式。

編輯:這是RowDetailTemplate:

    <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>

這是usercontrol(上面代碼中的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>

您可以使用Popup控件。 Popup窗口附加到數據網格的當前行,可能是當您單擊按鈕是創建彈出窗口的好地方並將其作為您所在行中的一個單元格的子項放置時。
然后,您可以將用戶控件添加到彈出窗口,然后“顯示”彈出窗口。 這樣,彈出窗口的DataContext以及usercontrol的DataContext繼承自datagrid中的包含行。

下面是一個使用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 你可以將你的usercontrol放在彈出窗口中,我放置了邊框和文本塊。 由於彈出窗口是stackpanel的成員,因此如果它沒有自己的一個,它會自動使用stackpanel的DataContext。

在您的實例中,我顯示的stackpanel將類似於您的DataGrid行。

好吧,我想對Gate Lumas的評論發表評論,但系統不會讓我這么做,所以我把它作為答案。

XAML Popup示例: 鏈接存檔 | 原始鏈接

如果您下載該示例並查看Senario1的.xaml和.cs文件,您將擁有一個如何使用和實現彈出窗口的完美示例。 或者,您可以瀏覽網站上的代碼,但我發現能夠運行和與示例交互更有幫助,而不僅僅是查看代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM